文章概述
本篇文章细说webpack4.x。
webpack 4.x
webpack打包工具
打包思想
根据一个入口js文件,通过依赖关系查找需要用到的所有资源,进行打包。
作用
- 打包(将多个文件打包成一个js文件,减少服务器压力);
- 转化(通过loader将less,sass,ts文件转化成浏览器可以识别的文件);
- 优化(单页应用复杂度越来越高,webpack可以对项目进行优化);
webpack结构
- 入口:entry
- 出口:output
- 转化器:loaders
- 插件:plugins
- 开发服务器:devServer
- 模式:mode(分为开发模式和生产模式);
webpack所需环境
- 安装node;
- 安装yarn;
使用方式
webpack简单打包
- 初始化config.json文件;
- 安装webpack支持库;
- 打包指定的js文件;
初始化config.json
执行如下命令,默认配置一路enter即可:
1 | $ npm init |
安装webpack
webpack4.x将webpack-cli工具分离出来,所以需要安装webpack和webpack-cli两个库,执行如下命令:
current version: webpack 4.16.1 webpack-cli 3.0.8
1 | $ npm install --save-dev webpack webpack-cli |
webpack打包指定js文件
- 创建dist目录作为打包目录,目录内创建index.html,引用bundle.js文件,此文件就是打包后的js文件;
- 创建index.js,根据选择器向index.html中输入hello world;
- 通过webpack命令将index.js文件打包到dist目录下,在powshell下执行如下命令:
1 | $ node_modules/.bin/webpack src/index.js --output dist/bundle.js |
- 将打包命令配置到package.json脚本:
1 | { |
- 这种手动打包单个js文件的方式,最终生成bundle.js和main.js文件,main.js是webpack自动生成的,这是因为没有配置webpack.config.js标准打包方法的原因,目前属于多余文件,可以不用管;
webpack配置文件打包
webpack.config.js
简介
webpack.config.js是webpack的配置文件;
配置文件构成
webpack.config.js是webpack的配置文件,结构如下:
1 | const path = require('path'); |
配置打包执行脚本
config.json中配置webpack打包执行脚本(带执行进度):
1 | { |
出口-入口
entry
entry作为webpack打包的入口,可以接受如下值:
- string:字符串表示的路径文件;
- json对象:key可以自定义,值为入口js文件路径;
- 数组:可以配置多入口,数组内js文件按顺序执行打包,
output
output表示出口配置,可配置属性如下:
- path:打包输出的路径地址,必须是绝对路径;
1 | //必须使用绝对路径的形式; |
- filename:出口打包js结果文件名;
1 | //指定确切的文件名: |
出入口配置
单入口单出口
可以使用字符路径、数组、json对象配置单入口,单入口写法:1
2
3
4
5
6
7
8
9
10//写法一:string
entry: './src/index.js',
//写法二:json
entry: {
enter: './src/index.js'
},
//写法三:array
entry: ['./src/index.js'],
1 | //单出口配置 |
多入口单出口
数组的方式配置多入口,配置方式如下:1
2//数组的方式配置多入口
entry: ['./src/index.js','./src/index2.js'],
1 | //单出口配置 |
多入口多出口
使用json对象配置入口,需要同时动态配置出口文件名;
1 | //多入口 |
插件
开发服务器插件
webpack-dev-server插件,用于配置开发服务器,在devServer配置项中配置.
下载
current version: 3.1.4
1 | $ yarn add webpack-dev-server -D |
配置服务
1 | const webpack= require('webpack'); |
配置执行脚本
config.json中添加执行启动访问本地服务的执行脚本:
1 | { |
热更新插件
webpack自带HotModuleReplacementPlugin插件来支持热更新,及时更新修改的地方;
使用
1 | const webpack = require('webpack'); |
静态资源文件输出插件
有一些静态文件,如excel、word文档等需要原样打包输出,可以使用copy-webpack-plugin插件。
安装
1 | $ yarn add copy-webpack-plugin -D |
使用
webpack.config.js中使用:
1 | //静态资源文件原样拷贝输出插件 |
ProvidePlugin(优雅使用第三方库)
ProvidePlugin是webpack自带的插件,用于向全局提供一个入口,来使用第三方工具包,不同于import导入的方式使用第三方库,ProvidePlugin配置的第三方库只有在真正使用时才会被打包;
使用
例如:使用jquery库的方式,在安装jquery后只需配置如下插件,即可在js文件中直接使用第三方库,而无需import:
1 | module.exports={ |
purify-css(消除冗余样式)
???按此配置后,js文件中的样式都会清除
去除没用到的css需要用到purifycss-webpack插件,而这个插件又依赖于purify-css。使用glob工具包配合处理符合条件的路径文件;
注意:purify-css只能消除分离出来的css文件中的冗余代码,所以需要与分离css插件一起使用。
安装
1 | $ npm i -D purifycss-webpack purify-css glob |
使用
1 | //这里以mini-css-extract-plugin来分离css |
clean-webpack-plugin
clean-webpack-plugin的作用是每次编译钱清除原来的编译文件;
安装
current version: 0.1.19
1 | //yarn |
使用
1 | moudle.exports={ |
uglifyjs-webpack-plugin(过时)
uglifyjs-webpack-plugin用来优化js的插件,主要用在js压缩,webpack4.x版本使用’—mode production’编译打包来替代;
安装
current version: 1.2.7
1 | $ npm i -D uglifyjs-webpack-plugin |
使用
直接引入,并配置到插件即可;
1 | //js压缩插件(使用--mode production代替) |
html-webpack-plugin
html-webpack-plugin是html文件处理插件
作用
- 为html文件引入外部资源,如script、link,每次编译后,会为引入的资源的地方为文件名动态添加hash,防止引用缓存的外部文件问题;
- 可以为入口js文件生成html,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面;
使用步骤
current version: 3.2.0
- 安装:
1 | $ npm i html-webpack-plugin -D |
- webpack.config.js中配置:
1 | //引入 |
- 此时打包,就会根据入口js文件,动态生成html文件;
如果需要多入口生成多个html文件,参照配置chunks属性;
可配置属性
总览
1 | const HtmlWebpackPlugin=require('html-webpack-plugin'); |
template
为入口js文件生成的html文件模板:
1 | template: './src/index.html' |
filename
打包js入口文件,生成的html文件的名称;
1 | filename: 'app.html', |
title
生成html文件指定标题,需要在模板html的title标签使用<%= htmlWebpackPlugin.options.title%>取标题;
1 | title: 'hello webpack', |
hash
设置为true,生成的html在资源文件引用处添加序列码,防止引用缓存;
1 | hash: true, |
inject
inject用来标识script标签应该放在html的哪里,有四个值:true body head false;
- true 默认值,script标签位于html文件的 body 底部;
- body script标签位于html文件的 body 底部;
- head script标签位于html文件的 head中;
- false 不插入生成的js文件,这个几乎不会用到的;
favicon
给你生成的html文件添加标签栏图标 ,值是一个路径:
1 | favicon: './src/resources/logo.jpg' |
cache
默认是true的,表示内容变化的时候才生成一个新的文件。
chunks
当使用json对象配置多入口时,chunks接受一个数组,数组内是入口的key,表示html模板需要引用的js入口文件,不配置时默认是全部引用;
案例:根据多入口生成多个html文件。
1 | entry: { |
minify
html压缩配置,详细请参考官方文档
1 | minify:{ |
loader
webpack通过在模块中配置loader来处理各种类型的文件;
babel-loader
babel-loader用来对js进行转码成es5
安装
1 | //babel转码工具包: |
配置babel配置文件[推荐]
.babelrc作为babel的配置文件,简单配置如下:
1 | { |
配置loader
1 | module.exports={ |
react转码
安装react支持包
1 | $ npm install --save react react-dom babel-preset-react |
babel配置支持react转码
.babelrc作为babel的配置文件,简单配置如下:
1 | { |
配置loader
1 | module.exports={ |
url-loader
处理外部资源的引用,如图片,url-loader依赖于file-loader。
安装
current version: file-loader 1.1.11 url-loader 1.0.1
1 | $ npm install --save-dev url-loader file-loader |
使用
1> webpack.config.js配置文件中配置loader:
1 | moudle.exports={ |
2> js文件中使用文件资源:
1 | //直接引用图片资源 |
1 | //css中引用 |
css-loader
处理css样式,依赖于style-loader
安装
current version: css-loader 1.0.0 style-loader 0.21.0
1 | $ npm install --save-dev css-loader style-loader |
直接配置css-loader
1> webpack.config.js配置文件中配置loader:
1 | moudle.exports={ |
2> js文件中引用css样式:
1 | import './index.css'; |
分离css
分离css,一般都会讲css样式进行分离,分离为独立的css文件,做法有两种,使用extract-text-webpack-plugin或mini-css-webpack-plugin(推荐).
extract-text-webpack-plugin(过时)
current version: 4.0.0-beta.0
1> 安装:
1 | //webpack4,需要next版本 |
2> 使用:
1 | const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin'); //分离css插件 |
mini-css-webpack-plugin
1> 安装:
current version: 0.4.1
1 | $ npm install --save-dev mini-css-extract-plugin |
2> 使用:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //分离css插件(官方推荐) |
sass-loader
sass-loader用来将.sass或.scss文件转成.css文件的,同css-loader使用方式类似。
安装
sass-loader依赖于node-sass,需要同时安装,node-sass需要翻墙;
current version: ndoe-sass 4.9.2 sass-loader 7.0.3
1 | $ npm install sass-loader node-sass webpack --save-dev |
直接使用
1 | moudle.exports={ |
分离css
extract-text-webpack-plugin
1 | const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin'); //分离css插件 |
mini-css-webpack-plugin
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //分离css插件(官方推荐) |
postcss-loader(兼容性前缀)
css3新增了一些属性,但是针对不同内核的浏览器,需要加不同的前缀才会有效, 如webkit等内核的浏览器,需要加-webkit-才会起作用,这里主要使用postcss-loader工具包里的autoprefixer插件,可以在打包时自动添加相关属性的前缀;
安装
current version: postcss-loader 2.1.6 autoprefixer 9.0.1
1 | $ npm i -D postcss-loader autoprefixer |
使用
1> 新建postcss配置文件: postcss.config.js:
1 | module.exports = { |
2> webpack.config.js中配置postcss-loader:
1 | //这里以mini-css-extract-plugin来分离css |
optimization(优化配置)
optimization配置项用于在webpack配置文件中优化webpack配置,同时它替代了CommonsChunkPlugin(提取公共模块)插件的功能。
配置示例(带注释)
1 | module.exports={ |
eslint代码检查配置
ESLint是js中目前比较流行的插件化的静态代码检测工具.
非必须
安装
1 | $ yarn add eslint |
配置loader
webpack.config.js文件配置支持的loader:
1 | module.exports ={ |
添加eslint配置文件
loader中配置了eslint后,还需要配置.eslintrc.js为eslint的配置文件,程序默认会加载它。
1 | module.exports = { |
执行检查
webpack按照上述配置好了eslint-loader,基本可以正常编译,如果打开了extends规则,就需要按照提示更改错误。
调试
webpack4.x
webpack4.x devServer的—mode production启动模式,可以直接在浏览器直观看到与项目编译前目录结构一样的源码,方便我们进行调试。
1 | //config.json文件的执行脚本配置如下: |
webpack3.x
webpack3.x需要在webpack.config.js文件中配置devtool为source-map即可在浏览器中查看与项目编译前目录结构一项的源码。
注意:source-map开启调试时尽量关闭压缩,上线时要关闭source-map。
1 | module.exports = { |
