Webpack4后包拆成webpack和webpack-cli两个包:

  1. // 安装webpack
  2. npm install --save-dev webpack webpack-cli

主要有以下这些一级配置:

  1. module.exports = {
  2. mode: 'development', // 模式配置,webpack4.0新增
  3. entry: '', // 入口文件
  4. output: {}, // 出口文件
  5. module: {
  6. rules: [/*loader setting*/]
  7. }, // 配置modules,包括loader
  8. plugins: [], // 对应的插件
  9. devServer: {}, // 开发服务器配置
  10. optimization: {}, // 最佳实践
  11. devtool: '',
  12. resolve: { alias: {}},
  13. }

1. mode

Webpack 4 引入了 mode 这个选项。这个选项的值可以是 development 或者 production。 设置了 mode 之后会把 process.env.NODE_ENV 也设置为 development 或者 production。然后在 production 模式下,会默认开启 UglifyJsPlugin 等一堆插件。
webpack4支持ES6的方式导入JSON文件,并且支持Tree-shaking


2. entry/output

默认的入口为’./src/‘和默认出口’./dist’。

3. mudule - rules - loader配置

webpack4中移除loaders配置,必须使用rules。rules 配置模块的读取和解析规则, 通常用来配置loader, 其类型是一个数组, 数组里每一项都描述了如何去处理部分文件。
配置一项rules大致通过以下方式:

  1. 条件匹配: 通过test、include、exclude三个配置来命中Loader要应用的规则文件。(三个配置都可以是正则,也支持数组)
  2. 应用规则: 对选中后的文件通过use配置项来应用loader,可以应用一个loader或者按照从后往前的顺序应用一组loader。同时还可以分别给loader传入参数。
  3. 重置顺序: 一组loader的执行顺序默认是从右到左执行,通过exforce选项可以让其中一个loader的执行顺序放到最前或者是最后。 ```json module: { rules: [
    1. {
    2. test: /\.m?js$/,
    3. exclude: /node_modules/,
    4. use: {
    5. loader: 'babel-loader',
    6. options: {
    7. presets: ['@babel/preset-env']
    8. }
    9. }
    10. },
    11. {
    12. test: /\.scss$/,
    13. use: ['style-loader', 'css-loader', 'sass-loader'],
    14. exclude: path.resolve(__dirname, 'node_modules')
    15. }
    ] }
  1. 常用loader:(待补充)
  2. - css
  3. - style-loader
  4. - css-loader
  5. - postcss-loader
  6. - sass-loader
  7. <a name="Uik4z"></a>
  8. ## 4. optimization
  9. Webpack4中引入,根据modeproduction/development)的不同,配置项默认值不同,具体有以下:
  10. 1. optimization.minimize 是否自动压缩打包后的代码。mode = production时,为true。压缩默认使用uglifyjs-webpack-plugin插件,如果想要使用别的压缩插件,可以使用optimization.minimizer设置。
  11. 1. optimization.splitChunks: 根据不同的策略来分割打包出来的bundle。配置基于[SplitChunksPlugin(opens new window)](https://webpack.js.org/plugins/split-chunks-plugin/),剔除了老的CommonsChunkPlugin(webpack4移除)。
  12. - optimization.splitChunks.chunks: async/all/initial
  13. 3. 零配置
  14. - optimization.nodeEnv: 告诉webpack process.env.NODE_ENV的值,值来自于mode的取值。代替[webpack.DefinePlugin(opens new window)](https://webpack.js.org/plugins/define-plugin/)(webpack4移除)
  15. - optimization.namedModules: 代替webpack.NamedModulesPluginwebpack4移除)
  16. - optimization.noEmitOnErrors: 代替webpack.NoEmitOnErrorsPluginwebpack4移除)
  17. - optimization.concatenateModules: 代替webpack.optimize.ModuleConcatenationPluginwebpack4移除)
  18. <a name="FBmPY"></a>
  19. ## plugins
  20. - 常用插件
  21. 1. HtmlWebpackPlugin 自动在html中加载打包后的js文件
  22. 1. DLLPlugin/DllReferencePlugin 提高打包速度
  23. - DLLPlugin:创建一个只有dllbundle
  24. - DllReferencePlugin 打包生成的dll文件引用到需要的预编译依赖上来
  25. 3. happyPack 多进程打包,加快打包速度。
  26. 3. webpack.DefinePlugin webpack4设置mode会自动使用
  27. 3. uglifyjs-webpack-plugin webpack4 mode = production默认使用
  28. - 废弃插件
  29. 1. CommonsChunkPlugin 拆分依赖包,生成单独文件,使得文件大小减小。在webpack4被废弃,替代optimization.splitChunks
  30. 1. ExtractTextWebpackPlugin 拆分css样式的插件(webapck4已废弃)。由于webpack4以后对css模块支持的逐步完善和commonchunk插件的移除,在处理css文件提取的计算方式上也做了些调整,之前我们首选使用的extract-text-webpack-plugin也完成了其历史使命,将让位于[mini-css-extract-plugin(opens new window)](https://github.com/webpack-contrib/mini-css-extract-plugin)。
  31. <a name="WcKoi"></a>
  32. ## <br />devServer
  33. 详见[Webpack4 devServer配置详解](https://lq782655835.github.io/blogs/project/webapck4-2.devServer.html)<br />举个完整例子:
  34. ```json
  35. const path = require('path');
  36. const webpack = require('webpack');
  37. // 插件都是一个类,所以我们命名的时候尽量用大写开头
  38. const HtmlWebpackPlugin = require('html-webpack-plugin'); //打包html
  39. const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 提取出来css
  40. const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); // 压缩打包后的js
  41. const HappyPack = require('happypack'); // 多线程构建
  42. const happyThreadPool = HappyPack.ThreadPool({ size: 5 }); // 构造出共享进程池,进程池中包含5个子进程
  43. const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')// 最大化压缩css
  44. console.log('process.env.NODE_ENV------->', process.env.NODE_ENV)
  45. // 解决css 分离后图片引入路径不正确问题
  46. if (process.env.type == 'build') { // 判断package.json里面是build还是dev命令
  47. // 开发
  48. var website ={
  49. publicPath:"/"
  50. }
  51. } else {
  52. // 生产
  53. var website ={
  54. publicPath:"/"
  55. }
  56. }
  57. module.exports = {
  58. // devtool:'eval-source-map',
  59. mode: 'development', // 模式配置
  60. entry: {
  61. main: './src/index.js',
  62. },
  63. output: {
  64. filename: 'bundle.[chunkhash:6].js',
  65. path: path.resolve(__dirname, 'dist'),
  66. publicPath: website.publicPath, // 解决css 分离后图片引入路径不正确问题
  67. },
  68. module: {
  69. rules: [
  70. {
  71. test: /\.css/,
  72. exclude: /node_modules/,
  73. use: ['style-loader', MiniCssExtractPlugin.loader, 'css-loader'],
  74. },
  75. {
  76. test: /\.less$/,
  77. exclude: /node_modules/,
  78. use: ['style-loader', MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'],
  79. },
  80. {
  81. test: /\.(png|jpe?g|gif|svg)$/,
  82. use: [
  83. {
  84. loader: 'url-loader',
  85. options: {
  86. limit: 10000,
  87. name: '[name]_[hash:7].[ext]',
  88. outputPath:'static/images/'
  89. }
  90. }
  91. ]
  92. },
  93. {
  94. test: /\.(htm|html)$/,
  95. use: 'html-withimg-loader'
  96. },
  97. // babel 解析es7 es6 jsx
  98. {
  99. test:/\.(jsx|js)$/,
  100. include: [
  101. path.resolve(__dirname, 'src'),
  102. ],
  103. use:['babel-loader'],
  104. /*
  105. 如果开启多线程进行构建
  106. use:['happypack/loader?id=js'],
  107. loader这样写 匹配下面注释的插件
  108. */
  109. exclude:/node_modules/
  110. },
  111. ]
  112. },
  113. plugins: [
  114. // 打包html
  115. new HtmlWebpackPlugin({
  116. template: './src/index.html',
  117. hash: true,
  118. minify: {
  119. minifyCSS: true,
  120. minifyJS: true,
  121. removeAttributeQuotes: true
  122. },
  123. }),
  124. new MiniCssExtractPlugin({
  125. filename: "static/css/[name].[chunkhash:8].css",
  126. chunkFilename: "[id].css"
  127. }),
  128. new UglifyJsPlugin({
  129. parallel: true,
  130. }),
  131. new webpack.DefinePlugin({
  132. NODE_ENV: JSON.stringify('DEV')
  133. }),
  134. // 多线程构建 匹配上面的loader
  135. // new HappyPack({
  136. // id: 'js',
  137. // //threads: 4,
  138. // loaders: ['babel-loader'],
  139. // threadPool: happyThreadPool, // 使用共享进程池中的子进程去处理任务
  140. // }),
  141. ],
  142. // 提取公共代码
  143. optimization: {
  144. minimizer: [
  145. // 自定义js优化配置,将会覆盖默认配置 最大化压缩成js
  146. new UglifyJsPlugin({
  147. exclude: /\.min\.js$/, // 过滤掉以".min.js"结尾的文件,我们认为这个后缀本身就是已经压缩好的代码,没必要进行二次压缩
  148. cache: true,
  149. parallel: true, // 开启并行压缩,充分利用cpu
  150. sourceMap: false,
  151. extractComments: false, // 移除注释
  152. uglifyOptions: {
  153. compress: {
  154. unused: true,
  155. warnings: false,
  156. drop_debugger: true
  157. },
  158. output: {
  159. comments: false
  160. }
  161. }
  162. }),
  163. // 用于优化css文件 最大化压缩成css 并且去掉注释掉的css
  164. new OptimizeCssAssetsPlugin({
  165. assetNameRegExp: /\.css$/g,
  166. cssProcessorOptions: {
  167. safe: true,
  168. autoprefixer: { disable: true },
  169. mergeLonghand: false,
  170. discardComments: {
  171. removeAll: true // 移除注释
  172. }
  173. },
  174. canPrint: true
  175. })
  176. ],
  177. splitChunks: {
  178. cacheGroups: {
  179. vendor: { // 抽离第三方插件
  180. test: /node_modules/, // 指定是node_modules下的第三方包
  181. chunks: 'initial',
  182. name: 'vendor', // 打包后的文件名,任意命名
  183. // 设置优先级,防止和自定义的公共代码提取时被覆盖,不进行打包
  184. priority: 10
  185. },
  186. // utils: { // 抽离自己写的公共代码,utils这个名字可以随意起 (css/js公用的都会单独抽离出来生成一个单独的文件)
  187. // chunks: 'initial',
  188. // name: 'utils', // 任意命名
  189. // minSize: 0 // 只要超出0字节就生成一个新包
  190. // }
  191. }
  192. }
  193. },
  194. devServer: {
  195. historyApiFallback: true,
  196. inline: true
  197. },
  198. // externals: {
  199. // jquery: "jQuery",
  200. // },
  201. resolve: {
  202. // alias 别名配置,它能够将导入语句里的关键字替换成你需要的路径
  203. alias: {
  204. // 比如我们就可以直接写 import Nav from '@/Nav'
  205. '@': './app/component'
  206. },
  207. // 省略后缀
  208. extensions: ['.js', '.jsx', '.less', '.json', '.css'],
  209. },
  210. performance: {
  211. hints: false // 选项可以控制 webpack 如何通知「资源(asset)和入口起点超过指定文件限制」
  212. }
  213. }