webpack4 个人配置
很久之前配过一份自用的webpack3,也一直在用,而4出来很久了,而且修改提升了很多,一直想升级成4,拖了很久,最近几天零零星星的时间,翻查资料,按着之前3的一些功能设置完成了一份4的配置,下面记录一下配置过程。
源码已经放 Github
设备
1 | > 电脑:MacBook Pro |
目标
- 自动生成html
- 自动清理dist文件夹
- 本地服务器
- 分离css
- 分离css图片
- 处理html图片
- 配置sass
- 自动添加css3前缀
- 消除未使用的css
- 配置babel
- 引入jquery
- 分割第三方js
- 配置全局资源文件夹
- 配置测试和生产环境
- 配置多入口多页面
过程
初始化
首先打开终端输入以下命令
1 | mkdir demo // 创建demo文件夹 |
注:// xxx 只是注释
此时你的 demo
文件夹里面的目录是如此的
1 | demo |
继续初始化目录成下面(以下目录仅是个人习惯)
1 | demo |
安装webpack
和webpack-cli
1 | cnpm install webpack webpack-cli --save-dev |
完成后目录会多出
node_modules
的资源目录,无需理会
添加配置文件(根目录新建 webpack.config.js
文件)
webpack.config.js
1 | const path = require('path'); |
以上是
webpack.config.js
文件初始化内容
NPM 脚本(NPM Scripts)
package.json
1 | { |
现在,可以使用
npm run build
命令了
1.自动生成html
设定 HtmlWebpackPlugin
首先安装插件,并且调整 webpack.config.js
文件:
1 | cnpm install --save-dev html-webpack-plugin |
webpack.config.js
1 | const path = require('path'); |
2.清理 /dist
文件夹
1 | cnpm install clean-webpack-plugin --save-dev |
webpack.config.js
1 | const path = require('path'); |
现在执行
npm run build
,再检查/dist
文件夹。如果一切顺利,你现在应该不会再看到旧的文件,只有构建后生成的文件!
3. 本地服务器
使用webpack-dev-server
为你提供了一个简单的 web 服务器,并且能够实时重新加载(live reloading)。
1 | cnpm install --save-dev webpack-dev-server //安装 |
修改配置文件,告诉开发服务器(dev server),在哪里查找文件:
webpack.config.js
1 | const path = require('path'); |
以上配置告知
webpack-dev-server
,在localhost:8080
下建立服务,将dist
目录下的文件,作为可访问文件。(注:现在你会看到浏览器会报一些mode
警告,先不用理,后面会处理)
package.json
1 | { |
现在,可以使用
npm run dev
命令打开本地服务器,在浏览器上看到/src/page/index.html
里的内容了
4.分离css
加载 CSS
1 | cnpm install --save-dev style-loader css-loader |
webpack.config.js
1 | const path = require('path'); |
打开入口文件/src/js/index.js
引入css
index.js
1 | import '../css/css.css'; |
运行
npm run dev
命令,就可以在浏览器上看到页面样式的变化了。(注:自行在/src/css/css.css
里添加对/src/page/index.html
页面的样式处理)
打包分离css
webpack4
中不再使用 extract-text-webpack-plugin
分离 css
而是使用 mini-css-extract-plugin
插件分离css
1 | cnpm install --save-dev mini-css-extract-plugin |
修改配置
webpack.config.js
1 | const path = require('path'); |
现在运行
npm run build
命令,查看/dist
文件目录,会看到一个分离出来的css
文件夹,里面会有一个app.css
文件,那个就是分离于/src/css/css.css
文件的内容。(注:app.css
文件的名字是关联于入口app:xxxx
中的app
名字)
5.分离css图片
加载图片
1 | cnpm install --save-dev file-loader |
webpack.config.js
1 | const path = require('path'); |
运行
npm run build
命令,可以在dist
目录里面看到images
文件夹里面会有css
里引入的图片。(注:自行在css
中加入图片样式看效果)
6.处理html图片
现在 css
里引用的图片可以使用,但是在 html
中通过 img
标签引用的图片还是无法正常使用,需要进行以下配置。
安装 html-loader
1 | cnpm install --save-dev html-loader |
webpack.config.js
1 | const path = require('path'); |
运行
npm run build
命令,可以在dist
目录里面看到images
文件夹里面会有html
里引入的图片。(注:自行在html
中加入图片样式看效果)
7.配置sass
安装
1 | cnpm install sass-loader node-sass --save-dev |
webpack.config.js
1 | const path = require('path'); |
/src/js/index.js
1 | - import '../css/css.css'; |
修改
index
中的引入,现在运行npm run dev
可以在浏览器看到页面效果,同时运行npm run build
可以在dist/css
文件夹里看到打包分离出来的css
文件(注:自行在scss.scss
中添加样式以便看效果)
8.自动添加css3前缀
编写使用 css3
样式需要添加各浏览器的前缀,现在可以配置成自动添加各个浏览器前缀
安装
1 | cnpm install --save-dev postcss-loader autoprefixer |
根目录新建 postcss.config.js
1 | module.exports = { |
webpack.config.js
1 | const path = require('path'); |
运行
npm run build
可以看到打包出来的样式文件效果如下。(注:以下只是个人测试样式)
/dist/css/app.css
1 | .test { |
9.消除未使用的css
如果项目中有很多写了但是没有使用的样式,打包出来的话会影响文件大小,现在配置一下,打包时自动消除未使用的样式
安装
1 | cnpm install --save-dev purifycss-webpack purify-css |
webpack.config.js
1 | const path = require('path'); |
现在可以在样式文件里加入一些没用的代码,然后运行
npm run build
在/dist/css
目录里的文件查看,可以看到没用的样式都没有被打包出来。
10.配置babel
es6
书写代码十分方便,但是项目上还是需要转换成 es5
比较保险,现在通过配置 babel
打包时可以自动转换,就可以放心写 es6
风格代码了
安装
1 | cnpm install --save-dev babel-loader@8.0.0-beta.0 @babel/core @babel/preset-env |
webpack.config.js
1 | const path = require('path'); |
现在在
/src/js/index.js
里面写入es6
风格代码,然后npm run build
后查看打包后的js
可以看到代码都被转换成es5
风格了。
11.引入jquery
由于个人项目需求,很多时候都会用上 jquery
所以在这里把 jquery
也进行了配置。
安装
1 | cnpm install --save-dev jquery |
webpack.config.js
1 | const path = require('path'); |
现在可以在
/src/js/index.js
中随意使用jquery
语法了。
12.分割第三方js
现在打包后你会发现,打包出来的 js
文件会很大,因为它把引入的 jquery
也打包到里面去了,我们现在希望可以单独把 jquery
分割出来,所以进行下面的配置
webpack.config.js
1 | const path = require('path'); |
现在运行
npm run build
可以在/dist/js
里面看到多出了vendor.js
文件,点击打开可以看到里面是jquery
的代码,而另外的app.js
文件小了很多。
13.配置全局资源文件夹
有时项目上有一些文件或其他的东西不希望进行打包,那么可以设置一个全局资源目录,里面的文件是全部原样搬运,不做打包处理。
安装
1 | cnpm install --save-dev copy-webpack-plugin |
webpack.config.js
1 | const path = require('path'); |
先在
/src/assets/
文件夹里放些东西,然后运行npm run build
进行打包,之后可以看到dist
文件夹里多出了assets
文件,里面存放着直接搬运过来的文件。
14.配置测试和生产环境
项目上本地测试环境和打包的生产环境需求会有很多不同,比如一些代码压缩,映射之类的,先在我们来配置双环境。
首先进行文件目录的修改(自行添加或删除)
1 | demo |
安装
1 | cnpm install --save-dev webpack-merge |
注:以下文件配置不做详细讲解,具体都做了些注释讲解了
webpack.common.js
1 | const path = require('path'); |
webpack.dev.js
1 | const path = require('path'); |
注:以上做了简单的热更新配置,并不完善
webpack.por.js
1 | const merge = require('webpack-merge'); |
mode
的配置分为none
,development
,production
完成上面的修改后,最后还需要修改以下文件
package.json
1 | { |
现在我们就简单的分开完成了公共配置,测试环境配置,和生产环境配置了。
运行
npm run build
和npm run dev
可以看到相关的效果。
15.配置多入口多页面
多入口和多页面,这个是我个人的一个想法配置,我希望是我的 /src/js/*.js
目录里面有几个 js
文件,那么 webpack
就自动给我添加几个入口,同理,我的 /src/page/*.html
目录里有几个 html
文件,那么 webpack
页给我打包出几个页面文件。并且我希望打包后的目录是下面这样的。
1 | dist |
以下写法有使用到 node
的一些语法函数,我仅做了简单的注释(理解并不一定正确,毕竟只是看过一点 node
的教程和文档而已)
webpack.common.js
1 | const path = require('path'); |
以上就可以配置之后就可以实现上面所讲的动态多入口和多页面效果了。
最后说明:多入口和多页面的配置只是我个人的一些逻辑想法而已,使用的时候要遵循的是,/src/js
里面的 js
文件名字要和 /src/page
里面的 html
文件名字一一对应,打包后每个页面引入的 js
是本页面对应名字的 js
和 vendor.js
即分割的第三方 js
这里是 jquery
(例:index.html
引入的是 index.js
和 vendor.js
,而 test.html
引入的是 test.js
和 vendor.js
,)
最最最后注意:js
和 page
名字一定要一一对应,一定要,一定要,一定要!
以上参考资料有 webpack官方文档,node官方文档
以上源码已经放 Github