likes
comments
collection
share

构建webpack5.x 知识体系:6、升级5.x遇到坑总结

作者站长头像
站长
· 阅读数 81

本篇主要是webpack4.x升级到5.x会遇到的坑的总结~~其实在前面系列的分享中,都分享到过,在此篇呢,主要总结一下,对于如果是项目中遇到问题了,哎,直接来着查查看,是什么问题就知道怎么改了~

构建webpack5.x 知识体系:6、升级5.x遇到坑总结

\

\

正式开始:

预备技能

基本nodejs知识和npm指令

注意:版本问题导致不同,本系列实战中用到的webpack版本是:"webpack": "^5.68.0","webpack-cli": "^4.9.2",

\

1、资源模块

Webpack 5现在已经对表示资源的模块提供了内置支持。这些模块可以向输出文件夹发送一个文件,或者向javascript包注入一个DataURI。无需配置额外 loader。

如,在前边篇幅中写道的,图片资源、字体、图标等

\

  • raw-loader => asset/source 导出资源的源代码
  • file-loader => asset/resource 发送一个单独的文件并导出 URL
  • url-loader => asset/inline 导出一个资源的 data URI
  • asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现

\

{
    // 处理图片
    // 问题:默认处理不了html中img图片
    test/.(jpe?g|png|gif|svg)$/,
    type"asset",

   // //解析
   parser: {
       //转base64的条件
       dataUrlCondition: {
       maxSize12 * 1024// 12kb
  }
  },
   generator: {
       filename'imgs/[name].[hash:6][ext]',
       // publicPath: './'
  },
},
{
   test/.(woff|woff2|eot|ttf|otf)$/i,
   type'asset/resource',
},

\

想继续使相关资源loader, 我们可以再原来的基础上添加

// !!!!!!注意这个坑,webpack5的问题,旧assets loader(比如raw-loader 、url-loader、file-loader) 已经弃用,需要添加这个配置

 type'javascript/auto',

不这么配置我们虽然编译不出差,但是打包后在浏览器找不到这些资源~

但是不建议,这样打包了这些loader,并不利于优化~~

\

     

2、启动命令

之前我们在npm scripts 配置启动本地的devserver命令由webpack-dev-server 改为了 webpack serve

\

3、 不支持babel-polyfill

全部兼容性处理,之前webpack4时我们使用babel-polyfill,但是在webpack5中改用@babel/runtime-corejs3和@babel/plugin-transform-runtime

\

{
                   test: /.jsx?$/,
                   exclude: /node_modules/,
                       use: {
                           loader: 'babel-loader',
                               options: {
                                   presets: [
                                      ['@babel/preset-env', {
                                           // 按需加载
                                           useBuiltIns: 'usage',
                                           // 指定core-js版本
                                           corejs: {
                                               version: 3
                                          },
                                           // 指定兼容性做到哪个版本浏览器
                                           targets: {
                                               chrome: '60',
                                               firefox: '60',
                                               ie: '9',
                                               safari: '10',
                                               edge: '17'
                                          }
                                      }]
                                  ]
                              }
                      }

      },

\

4、optimize-css-assets-webpack-plugin 使用错误

webpack5不在使用optimize-css-assets-webpack-plugin。 这是因为optimize-css-assets-webpack-plugin 在webpack5中已不在友好支持。

这个时候要改为使用插件:css-minimizer-webpack-plugin

optimization: {
   minimizer: [
       new CssMinimizerWebpackPlugin(),
  ],
},

\

5、eslint-loader编译报错

改为使用:eslint-webpack-plugin插件

\

使用步骤:

\

5.1、安装配置 eslint-webpack-plugin1)安装 eslint-webpack-plugin:(该插件使用 eslint 来查找和修复 JavaScript 代码中的问题。)npm install eslint-webpack-plugin --save-dev注意: 如果未安装 eslint >= 7 ,你还需先通过 npm 安装:

npm install eslint --save-dev

2)配置:webpack.config.js文件中:

const ESLintPlugin = require('eslint-webpack-plugin');

plugins: [
   new ESLintPlugin({
     exclude:'node_modules'//排除node_modules文件夹的eslint检查
     fix:true //自动修复js格式错误
  })
],

5.2、设置检查规则可参考官方文档:www.npmjs.com/package/esl… 6+。它需要eslint和eslint-plugin-import,eslint前面已经安装过,就不要再次安装npm install eslint-config-airbnb-base eslint-plugin-import --save-dev2)配置:两种方式:方式一:.eslintrc文件中添加:"extends":"airbnb-base方式二:package.json文件中添加:"eslintConfig": { "extends": "airbnb-base" } 5.3、编写js文件,检查配置eslint的可用性webpack运行项目,出现以下警告,可在js文件中有console.log()输出语句的上方,添加// eslint-disable-next-line,即可忽略该输出语句的警告提示。

\

6、HMR

在webpack5中不需要在安装插件,webpac5中自带,devServer.hot参数:默认webpack开启

// webpack 配置
module.exports = {
// ...
  devServer: {
   
      // 开启HMR功能
      hot: true,
  }

}

此时我们就实现了基本的模块热替换功能

\

在js中我们使用HMR的时候

if (module.hot) {
  // module.hot 表示开启HMR
  module.hot.accept('./assets/js/util.js', () => {
      const isStr = print('./assets/js/util.js');
      // eslint-disable-next-line
      console.log('./assets/js/util.js 被执行~~~', isStr);
  });
}

module这是commonjs如果我们设置能在js中使用,需要改为下边的,esmodule的形式

module.hot需要更改为

import.meta.webpackHot

\

如果还有其他的错误出现,不在这其中,欢迎大家评论留言~

\

感谢

到此,本篇介绍到此结束,之后将陆续整理 webpack 知识体系的内容分享,尽情期待,感谢您的阅读~~

转载自:https://juejin.cn/post/7135693176878628894
评论
请登录