1. module.exports = {
  2. entry: {}, // 入口文件
  3. output: {}, // 出口文件
  4. module: {
  5. rules: [
  6. {
  7. test: /\.css$/i,
  8. use: [
  9. // 在 head 中创建 style 标签
  10. 'style-loader',
  11. // 将 CSS 转化成 CommonJS 模块
  12. 'css-loader'
  13. ]
  14. },
  15. {
  16. test: /\.s[ac]ss$/i,
  17. use: [
  18. // 在 head 中创建 style 标签
  19. 'style-loader',
  20. //// 抽离 css 为独立文件
  21. MiniCssExtractPlugin.loader,
  22. // 将 CSS 转化成 CommonJS 模块
  23. 'css-loader',
  24. {
  25. loader: 'postcss-loader',
  26. options: {
  27. postcssOptions: {
  28. plugins: [
  29. [
  30. 'postcss-preset-env',
  31. {
  32. // 其他选项
  33. },
  34. ],
  35. ],
  36. },
  37. },
  38. },
  39. // 将 Sass 编译成 CSS
  40. 'sass-loader',
  41. ],
  42. },
  43. {
  44. test: /\.s[ac]ss$/i,
  45. use: [
  46. // 抽离 css 为独立文件
  47. MiniCssExtractPlugin.loader,
  48. // 将 CSS 转化成 CommonJS 模块
  49. 'css-loader',
  50. // 将 Sass 编译成 CSS
  51. 'sass-loader',
  52. ],
  53. },
  54. {
  55. test: /\.js$/,
  56. exclude: /node_modules/, // 排除node_modules
  57. use: {
  58. loader: 'babel-loader',
  59. options: {
  60. // 配置预设
  61. presets: ['@babel/preset-env'],
  62. plugins: [
  63. ['@babel/plugin-transform-runtime'] // 转换async await语法
  64. ]
  65. }
  66. }
  67. }
  68. ]
  69. },
  70. plugins: [
  71. new MiniCssExtractPlugin({
  72. // 对输出结果重命名
  73. filename: 'assets/css/[name].css'
  74. })
  75. ],
  76. optimization: {
  77. splitChunks: {
  78. // 缓存第三方库
  79. cacheGroups: {
  80. vendor: {
  81. test: /[\\/]node_modules[\\/]/,
  82. name: 'vendors',
  83. chunks: 'all'
  84. }
  85. }
  86. },
  87. minimizer: [
  88. // 压缩 CSS 代码,仅在生产模式下有效
  89. new CssMinimizerPlugin()
  90. ],
  91. },
  92. externals: {
  93. }
  94. };

JS高级语法处理

babel-loader

  • babel-loader: webpack 应用babel 解析ES6的的桥梁,本身自己并不将 ES6转ES5
  • @babel/core:babel核心代码,当webpack使用babel-loader处理文档时,babel-loader实际上调用了babel-core的api
  • @babel/preset-env:babel预设,根据环境仅仅转译环境不支持的语法,而不知全部转换为es5

    1. npm i babel-loader @babel/core @babel/preset-env -D

    regeneratorRuntime

    regeneratorRuntime 是 webpack 打包生成的全局辅助函数,由 babel 生成,用于兼容 async/await 的语法。

    1. npm i @babel/runtime @babel/plugin-transform-runtime -D

    CSS处理

    抽离 CSS 代码为独立文件

    1. npm i mini-css-extract-plugin -D

    CSS 代码压缩(生产模式)

    1. npm i css-minimizer-webpack-plugin -D

    CSS 兼容性处理

    1. npm i postcss-loader postcss postcss-preset-env -D

    在根目录下创建 postcss.config.js 文件并进行配置

    1. module.exports = {
    2. plugins: [
    3. [
    4. 'postcss-preset-env',
    5. {
    6. // 其他选项
    7. },
    8. ],
    9. ],
    10. };

    Externals

    1. module.exports = {
    2. //...
    3. externals: {
    4. react: 'react',
    5. },
    6. // 或者
    7. externals: {
    8. lodash: {
    9. commonjs: 'lodash',
    10. amd: 'lodash',
    11. root: '_', // 指向全局变量
    12. },
    13. },
    14. // 或者
    15. externals: {
    16. subtract: {
    17. root: ['math', 'subtract'],
    18. },
    19. },
    20. };

    此语法用于描述外部 library 所有可用的访问方式。这里 lodash 这个外部 library 可以在 AMD 和 CommonJS 模块系统中通过 lodash 访问,但在全局变量形式下用 _ 访问。subtract 可以通过全局 math 对象下的属性 subtract 访问(例如 window[‘math’][‘subtract’])。

resolve解析

  1. module.exports = {
  2. //...
  3. resolve: {
  4. enforceExtension: false,
  5. // 能够使用户在引入模块时不带扩展: import File from '../path/to/file';
  6. extensions: ['.js', '.json', '.wasm'],
  7. alias: {
  8. xyz$: path.resolve(__dirname, 'path/to/file.js'),
  9. },
  10. },
  11. };
  • enforceExtension 如果是 true,将不允许无扩展名文件。默认如果 ./foo 有 .js 扩展,require(‘./foo’) 可以正常运行。但如果启用此选项,只有 require(‘./foo.js’) 能够正常工作。
    1. import Test1 from 'xyz'; // 精确匹配,所以 path/to/file.js 被解析和导入
    2. import Test2 from 'xyz/file.js'; /