第十章 使用webpack(进阶篇)

webpack已经更新到了版本4,关于版本的问题,相信很多小伙伴们在学习的时候碰到好多坑,本篇文章是基于webpack2的教程进行学习的,但是尽可能的使用webpack4的语法学习,于是不免出现纰漏,或者出现混杂,如有问题,请及时解决。


10.1前端工程化与webpack

通常,前端自动化(半自动化)工程主要解决以下问题:

  • javaScript CSS代码的合并与压缩
  • CSS预处理:Less、Sass、Stylus的编译
  • 生成雪碧图(CSS Sprite)
  • ES6转ES5
  • 模块化
    ……
    如果熟悉Gulp,我们知道经过Gulp合并压缩后的代码仍然是你写的代码,只是局部变量名被替换,一些语法做了转换而已,整体内容并没有发生变化。而我们要学习的webpack,打包后的代码已经不只是你写的代码了,其中夹杂了很多webpack自身的模块处理代码。因此,webpack最难的是理解“编译”这个概念。
    在webpack的世界里,一张图片、一个css甚至一个字体,都成为模块(Module),彼此存在依赖关系,webpack就是来处理模块间的依赖关系的,并把它们进行打包。
    webpack的主要适用场景是单页面富应用(SPA)。SPA通常是由一个html文件和一堆按需加载的.js组成,它的html结构可能会非常简单。
    在进行webpack的学习之前,我们先来学习两个ES6中的语法:export和import。
    export和import是用来导入和导出模块的,一个模块就是一个js文件,他拥有独立的作用域,里面定义的变量外部是无法访问的,因此需要使用export导出。
    模板导出后,在需要使用模块的文件使用import导入。
    export与import海洋其他的用法,这里不做详细介绍。

10.2 webpack基础配置

10.2.1 安装webpack、webpack-cli与webpack-dev-server

在安装webpack前,先确保已经安装了最新版的Node.js和NPM,并且了解NPM的一些基本用法。

  1. 首先,创建一个目录,比如demo,使用NPM初始化配置。
  npm init 
  1. 执行后,会有一系列选项,可按回车键快速确认 ,完成后会在demo目录生成一个package.json的文件。之后在本地局部安装webpack:
npm install webpack --save-dev
  1. --save-dev会作为开发依赖来安装webpack。安装成功后,在package.json中会多一项配置:
"dependencies": {
"webpack": "^4.17.2"

}

4.接着需要安装webpack-dev-server,它可以在开发环境中提供很多服务,比如启动一个服务器、热更新、接口代理等,配置起来也很简单。同样,在本地局部安装:

npm install webpack webpack-dev-server --save-dev

安装完成后,最终的package.json文件内容为:

{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
  "webpack": "^4.17.2",
  "webpack-dev-server": "^3.1.7"
  }
}
10.2.2就是一个js文件而已

接下来需要了解webpack的一些核心概念。
归根到底,webpack就是一个.js文件,你的架构好或差都体现在这个配置上,随着需求的不断出现,工程配置也是逐渐完善。
1.首先,我们在目录DEMO下创建一个js文件:webpack.config.js,并初始化它的内容:

var config= {
  //这里的module.exports相当于export default config.由于目前还没安装支持ES6的编译插件,因此不能直接使用ES6的语法。
};
module.exports=config;

2.然后在package.json的scripts里增加一个快速启动webpack-dev-server服务的脚本:

{
 //……
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev":"webpack-dev-server --open --config webpack.config.js"
},
 //……

TIPS:由于我们这里安装的是webpack4,所有这里需要安装webpack-cli,才可以继续下一步,但是这里学习的是webpack2,所以我们不作为一个步骤,安装webpack4的小伙伴,继续在命令行中执行:npm install webpack-cli
3.当运行npm run dev命令时,就会执行webpack-dev-server --open --config webpack.config.js命令。其中,--config是指向webpack-dev-server读取的配置文件路径.
--open会在执行命令时自动在浏览器打开页面,默认地址是127.0.0.1:8080,不过IP和端口都是可以配置的,比如:

{
 //……
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --host 192.168.199.102 --port 8888
             --open --config webpack.config.js"
},
 //……    

webpack配置中组主要的也是必选的两项是入口(Entry)和出口(Output)。入口的作用是告诉webpack从哪里开始寻找依赖,并且编译,出口则是用来配置编译后的文件存储位置和文件名。
在demo目录下新建一个空的main.js作为入口的文件,然后再webpack.config.js中进行入口和输出的配置(webpack4的配置):

const path=require('path'); //nodejs的语法,引入路径模块,为了输出的时候找绝对路径

module.exports={
entry:'./src/main.js',  //入口文件为main.js  
output:{    //输出
    path:path.resolve(__dirname,'dist'),    //path.resolve为nodejs的固定语法,用于找到当前文件的绝对路径
    filename:'bundle.js'    //输出的文件名
},
};

在终端里执行命令webpack后,不出意外的话终端里显示如下就表示成功了


success.jpg

同时看一下文件结构目录,多了一个dist文件夹,以及bundle.js文件。这两个就是webpack打包生成的文件,如下:


bundle.jpg

在index.html文件里引入bundle.js文件后,用浏览器打开index.html(或者执行完webpack后,执行npm run dev,然后打开IP地址),可以看到页面里有内容了。这就代表我们已经使用webpack打包了一个文件,它的基本用法已经跑了。
<body>
<div id="box"></div>
<script src="dist/bundle.js"></script>
</body>

这里一定要注意引用的bundle.js一定要在div下面引用,如果在<head>中引用,会报错!

10.2.3语法及步骤
语法

一.entry入口文件
只打包一个文件(单入口),写个字符串
把多个文件打包成一个文件,写个数组
把多个文件分别打包成多个文件,写成对象
webpack把打包后的文件叫Chunck
二.output出口文件
1.filename 输出文件的名称
①、输出一个文件,写个字符串
②、输出多个文件,文件名前面加个标识符(id/name/hash)
2.path输出文件的路径
①、路径必需为绝对路径
②、__dirnamenodejs里的一个模块,表示当前文件的绝对路径
③、path为nodejs的系统模块,直接引入后调用path.resolve(__dirname,'输出文件的路径');

步骤

当我们在终端里输入webpack命令的时候webpack会按以下的步骤开始工作

1.先打开根目录下的webpack.config.js
2.找entry(入口)属性的值
3.进入到main.js里,看到它又依赖show.js,再找到show.js
4.把main.jsshow.js合并成一个js文件
5.在webpack.config.js里找到output(出口)属性
6.解析output里的pathfilename属性的值
7.把第4步合并成的js文件放到dist文件夹里,并起个名字叫bundle.js

10.2.4 Plugin

下面就以这个html-webpack-plugin插件为例,给大家演示插件的用法。这个插件的作用是用来自动生成html页面,既可以生成单个页面又可以生成多个页面,并且在生成前你可以给它一堆的配置,它会按照你想要的生成方式去生成页面。
第一步:安装

 npm i html-webpack-plugin -D

第二步:在webpack.config.js里引入模块

const HtmlWebpackPlugin=require('html-webpack-plugin');

第三步:在plugins里new一个

plugins:[
new HtmlWebpackPlugin()

]
此时webpack.config.js的内容如下:

const path=require('path'); //nodejs的语法,引入路径模块,为了输出的时候找绝对路径
const HtmlWebpackPlugin=require('html-webpack-plugin');

module.exports={
    entry:'./src/main.js',  //入口文件为main.js  
    output:{    //输出
        path:path.resolve(__dirname,'dist'),    //path.resolve为nodejs的固定语法,用于找到当前文件的绝对路径
        filename:'bundle.js'    //输出的文件名
    },
    plugins:[
        new HtmlWebpackPlugin()
    ]
};

第四步:在终端里执行命令webpack,如果不出意外的话是下面这样:


index.jpg

未完待续,明天我们接着来webpack!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容