侧边栏壁纸
博主头像
KLCode

水到绝处是风景,人到绝处是重生

  • 累计撰写 24 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

webpack 常用loader、plugin

webpack 常用loader、plugin

主流框架脚手架

  • Vue 脚手架 vue-cli

  • React 脚手架 creact-react-app

  • Taro 脚手架 taro-cli

常用依赖包

  • cross-env:跨平台(windows、linux,...)设置环境变量工具,用来设置或修改环境变量

  • env-cmd:用于在命令行中运行命令时加载环境变量的工具

    • -f .env.prod:指定加载的环境文件.env.prod,并加载其中的环境变量
  • web-vitals:项目性能测试

  • @commitlint/config-conventional 是一个预定义的 commitlint 配置,它定义了一组常见的 Git 提交信息格式规范

常用的第三方库

  • lodash

  • moment.js

  • axios

  • Antd、Element UI

  • Redux、React Router、Vuex、Vue Router

常用的babel插件

  • transform-remove-console 移除代码中的 console.log

  • @babel/preset-env:根据目标浏览器或运行环境自动选择需要转换的语法和特性

常用的webpack插件

  • progress-bar-webpack-plugin 显示 Webpack 构建状态信息

  • useless-files-webpack-plugin:项目无用文件清理插件

  • webpack-bundle-analyzer 优化包体:https://juejin.cn/post/7035951233907032077

  • terser-webpack-plugin:js文件压缩

    • 当项目过大时,可开启 parallel 参数,增加进程

    • cache: true,可以缩短打包时间

  • speed-measure-webpack-plugin:看到整个打包耗时、每个 Plugin 和 Loader 耗时,可快速定位可优化的Plugin

  • react-refresh-webpack-plugin:热更新插件

    • create react app 集成了热更新插件,最新版默认启用
  • html-webpack-plugin:根据模板生成 HTML 文件,并自动将打包后的 JS 和 CSS 文件引入到 HTML 文件中

    • create react app 集成并使用了插件,会以public的index.html 作为模板

    • 插件本身也有对html 压缩,html-webpack-plugin 支持修改minify 自定义压缩设置

  • commons-chrunks-webpack-plugin:拆包插件

    • webpack4 默认内置了CommonsChunkPlugin,webpack5推荐用splitChunks替代
  • css-minimizer-webpack-plugin:css文件压缩

  • mini-css-extract-plugin:将css 从js文件中分离

  • purgecss-webpack-plugin:对 CSS Tree Shaking,打包时去除无用css

  • module-federation-import-remote:实现远程模块导入的插件,微前端神器

常用的loader

  • babel-loader:把 ES6+转换成 ES5

    • cacheDirectory:true 可以缩短打包时间,create react app时, 默认为true
  • sass-loader、less-loader

  • sass-resources-loader:将指定的 Sass 文件作为全局的变量文件引入

  • postcss-loader 将CSS 代码转换为符合标准的 CSS 代码

  • eslint-loader ESLint 检查 JavaScript 代码

  • thread-loader:多线程提高webpack 构建速度

    • 适用于大项目启动慢的情况,因为引入thread-loader本身也需要构建时间

目前已知的webpack5已集成的内置插件,与第三方插件相似的有哪些?

  • Code Splitting:optimization.splitChunks 分包,类似splitChunksPlugin

  • Tree Shaking:mode:production 默认开启

  • Asset Modules:处理静态资源,类似file-loader 和 url-loader

  • 持续化缓存:cache, 类似cache-loader

  • ModuleFederationPlugin:应用程序之间的模块共享,微前端的更好方案。类似ModuleFederationPlugin

  • HotModuleReplacementPlugin :热更新,内置 webpack-dev-server 和 webpack-hot-client

  • TerserWebpackPlugin:js代码压缩,内置最新版terser-webpack-plugin

  • HtmlWebpackPlugin:html代码压缩,内置最新版html-webpack-plugin

  • ProgressPlugin:构建进度插件,类似于progress-bar-webpack-plugin

webpack5 的其他内置功能

  • DefinePlugin:用于定义全局常量,也可以将环境变量赋值为全局常量,在JS中使用

    • 环境变量可从scripts 的命令行获取,即process.env.变量名。或env-cmd 读取环境文件的变量

    • cross-env 可以保证命令行在跨平台正常执行

  • ProvidePlugin:全局注入变量或模块,如全局注入lodash 的get方法

    new webpack.ProvidePlugin({
     $_get: ['lodash','get']
    });
    

webpack-bundle-analyzer

analyze-bundle-size.js脚本

const fs = require('fs')

function analyzeBundleSize(reportFilename, maxSize) {
  const limit = maxSize * 1024
  const report = JSON.parse(fs.readFileSync(reportFilename, 'utf8'))

  const invaildChunk = []
  for (const chunk of report) {
    if (chunk.gzipSize > limit) {
      invaildChunk.push({
        name: chunk.label,
        size: `${Math.round(chunk.gzipSize / 1024)}KB`,
      })
    }
  }
  if (invaildChunk.length) {
    console.log(`The following bundles exceed the ${maxSize}KB limit`)
    console.table(invaildChunk)
    process.exit(1) // 非零的退出码表示错误
  }
}

const reportFilename = process.argv[2]
const maxSize = Number(process.argv[3])

analyzeBundleSize(reportFilename, maxSize)

.gitlab-ci.yml执行脚本

node analyze-bundle-size.js ./analyzer/bundle-size-report 300

webpack loader 配置示例

module.exports = {
	...
  module: {
    rules: [
      {
        test: /\.(css|less|s[a|c]ss)(\?.*)?$/i,
        use: [
          {
            loader: process.env.NODE_ENV === 'development' ? 'style-loader' : miniCssExtractPlugin.loader 
          },
        ],
      },
      {
        test: /\.css$/i,
        use: [
        	{
            loader: 'css-loader'
          },
          {
            loader: 'postcss-loader'
          },
        ],
      },
      {
        test: /\.less$/i,
        use: [
          {
            loader: 'css-loader'
          },
          {
            loader: 'postcss-loader'
          },
        	{
            loader: 'less-loader'
          },
        ],
      },
      {
        test: /\.s[a|c]ss$/i,
        use: [
          {
            loader: 'css-loader'
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                require('autoprefixer')
              ]
            }
          },
        	{
            loader: 'sass-loader'
          },
        ],
      },
    ],
  },
}
0

评论区