Webpack项目工程化构建配置。
Github仓库:webpack4-config
创建package.json
1 | npm init |
1 | package name: (test) test |
安装webpack
1 | cnpm i --save-dev webpack |
配置 webpack.config.js
webpack.config.js
会最终暴露出一个配置对象。
1 | const config = {}; |
mode
webpcak4新增了mode,用于根据环境选用对应配置,不设置会warning: The 'mode' option has not been set, webpack will fallback to 'production' for this value...
1 | const config = { |
entry & output
webpack入口和输出。entry/output
是一个对象,可以定义多个入口。配置output,使其根据入口加上hash动态生成打包后的名称:
1 | const path = require("path"); |
以上用了path
做了路径处理,path
是node.js
内置的package
,用来处理路径。path.resolve(__dirname, "dist")
会生成返回一个绝对路径,以储存生成的文件。publicPath
并不会对生成文件的路径造成影响,主要是对页面里面引入的资源的路径做对应的补全。如publicPath: "/"
后,生成的页面引入js的路径为src="/[name].[hash].js"
,本地预览会报错,设置成publicPath: "./"
===> src="./[name].[hash].js"
则可以解决问题。
devtool
指定sourceMap模式。
sourceMap模式有很多种,具体可看:webpack——devtool里的7种SourceMap模式
vue-cli的webpack.dev.conf.js使用了cheap-module-eval-source-map
。
生产环境这里使用hidden-source-map
。
1 | const config = { |
devServer
- 在开发模式下,DevServer 提供虚拟服务器,让我们进行开发和调试。
- 提供实时重新加载,减少开发时间。
- 它不是 webpack 内置插件,要安装
1 | cnpm i --save-dev webpack-dev-server |
1 | const config = { |
可参考:官方文档 、 segmentfault。
这里我们将开发的devServer单独分为一个js文件,并通过node运行文件从而跑起服务器。
安装依赖:
1 | cnpm i --save-dev opn webpack-dev-server |
新建: /build/dev-server.js
1 | const webpackDevServer = require('webpack-dev-server'); |
在package.json
中添加脚本命令:
1 | { |
注释掉webpack.config.js
中配置的devServer
:
1 | const config = { |
执行npm run dev
即可开启服务。(别急着运行,继续配置)
plugins
plugins
选项用于以各种方式自定义 webpack
构建过程。webpack
附带了各种内置插件,可以通过webpack.[plugin-name]
或者直接引入require([plugin-name])
访问这些插件。 自带插件
html-webpack-plugin
自动生成html,插入script。
更多: 官方配置、html-minifier配置、html-minifier中文文档
1 | const HtmlWebpackPlugin = require("html-webpack-plugin"); |
mini-css-extract-plugin
自带插件,为每个引入 css 的 JS 文件创建一个 css 文件,css抽离,并写入html。
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
clean-webpack-plugin
删除文件夹,避免因为生成的文件带hash,而一直存在。
1 | cnpm i --save-dev clean-webpack-plugin |
1 | const CleanWebpackPlugin = require("clean-webpack-plugin"); |
HotModuleReplacementPlugin
启用热替换模式。
NamedModulesPlugin
在控制台中输出可读的模块名。
HashedModuleIdsPlugin
文件未变动时,保持build出来的文件hash不变。
1 | // 三种插件webpack自带 |
performance
配置如何展示性能提示。
默认不配置下开启devServer时,会提示:
1 | WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). |
因为限制了文件大小为250kb,如果超过就会提示;
1 | const config = { |
loader
loader 用于对模块的源代码进行转换。我们可以使用loader将less/sass/scss/stylus转为css并压缩、兼容处理等,可以将js es6/7语法转为es5等等。
处理less
安装:
1 | cnpm i --save-dev less css-loader postcss-loader less-loader autoprefixer mini-css-extract-plugin |
1 | // css抽离 |
使用mini-css-extract-plugin
会将js中的css抽离出来,打包成单独的文件,从而避免默认情况下,打包后,由于css通过js动态插入到html中,导致页面闪动。
使用css-loder
能够解析js中引入的css:import "main.less"
。
使用style-loader
把加载的css作为style标签内容插入到html中。
使用postcss-loader autoprefixer
能够将css代码自动加兼容性前缀,配置如上代码。
使用less-loader
将less代码转为css。
babel-loader
Babel是编写下一代JavaScript的编译器,可以将当前运行平台(浏览器、node服务器)尚不支持的下一代或几代js语法编译为当前支持的js语法版本。
使用babel-loader将es6/7语法转为es5浏览器可执行代码。
1 | // babel-loader已经升级到了8,需要装@babel/core,但是还是有问题,所以这里安装@7.1.5 |
1 | const config = { |
babel-preset-env
是一个新的 preset,(presets是一系列plugin的集合)可以根据配置的目标运行环境,自动启用需要的 babel 插件,由于Preset 的执行顺序时从最后一个逆序执行,所以env
写在最前,就当是保底… 但是使用preset依然不会解析Set/Map这样的,这时候就要用babel-polyfill
了。babel-polyfill
简单描述就是只要引入了babel-polyfill
你可以大胆的用ES6,可参考ES6和Babel你不知道的事儿,但是使用后会使代码体积增大,视需求而定。在文件入口引入babel-polyfill
即可使用: import "babel-polyfill"
.stage-0
是对ES7一些提案的支持,Babel
通过插件的方式引入,让Babel可以编译ES7代码。当然由于ES7没有定下来,所以这些功能随时肯能被废弃掉的。参考:如何区分Babel中的stage-0,stage-1,stage-2以及stage-3,其通过插件方式引入,所以需要安装:
1 | cnpm i --save-dev babel-preset-stage-0 |
url-loader
使用url-loader而非file-loader,因为前者包含了后者,提供了更为强大的功能。他可以解决css样式中引入的图片文件等打包后路径指向不正确和将图片转为DataURL模式(base64编码的字符串形式,More:DATA URL简介及DATA URL的利弊)从而提高网站的加载速度。更多参考:file-loader 和 url-loader
1 | cnpm i --save-dev url-loader file-loader |
1 | const config = { |
optimization
优化。
1 | // css优化压缩 |
build
使用webpack
命令即可开始构建,也可以自定义命令npm run build
:
package.json:
1 | { |
仓库
Github:webpack4-config