• webpack打包优化


    此次优化主要使用了happypackcache-loader两个打包的插件

    happypack

    在使用 Webpack 对项目进行构建时,会对大量文件进行解析和处理。当文件数量变多之后,Webpack 构件速度就会变慢, Happypack 作用在 loader 上, 可以将文件解析任务分解成多个子进程并发执行。子进程处理完任务后再将结果发送给主进程。所以可以大大提升 Webpack 的项目构件速度。

    ⚠️在测试 Demo 或者小型项目中,使用 happypack 对项目构建速度的提升不明显,甚至会增加项目的构建速度, 在比较复杂的大中型项目中,使用 happypack 才能看到比较明显的构建速度提升

    • 使用
     npm install happypack --save-dev (安装)
    
    //在webpack.base.config.js文件里面
    const HappyPack = require('happypack');
    
    module.exports = {
        ...
        module: {
            rules: [
                test: /.js$/,
                // 用下面的方式替换成 happypack/loader,并使用 id 指定创建的 HappyPack 插件
                use: ['happypack/loader?id=babel'],
                include: [resolve('src')]
            ]
        },
        plugins: [
            ...,
            new HappyPack({
                /*
                 * 必须配置
                 */
                // id 标识符,要和 rules 中指定的 id 对应起来
                id: 'babel',
                // 需要使用的 loader,用法和 rules 中 Loader 配置一样
                // 可以直接是字符串,也可以是对象形式
                loaders: ['babel-loader']
            })
        ]
    }
    
    • 效果
      bulid time 减少了大约 10%-20%左右

    cache-loader

    在一些性能开销较大的 loader 之前添加cache-loader,会将结果缓存到磁盘里, 因为要写入到磁盘上,所以第一次的 build 会比原本还要多花一些时间,但是第二次 build 就会减少很多的时间。

    ⚠️ 请注意,保存和读取这些缓存文件会有一些时间开销,所以请只对性能开销较大的 loader 使用此 loader,经对比发现,对babel-loader和ts-loader使用cache-loader, 效果明显。

    • 使用
     npm install cache-loader --save-dev (安装)
    
    //在webpack.base.config.js文件里面
    module.exports = {
      ...
      module: {
        rules: [
          {
            test: /.js$/,
            // 直接将cache-loader放在需要缓存的loader前面即可
            use: ['cache-loader', 'babel-loader'],
            include: [resolve('src')],
          },
        ],
      },
    };
    
    • 效果
      除开第一次build需要花费较长时间外,后面bulid time 减少了大约 20%-40%左右

    ▶◀除此之外,还修改了原来的打包方式, 原打包方式是会直接删除release文件夹,release文件夹里面包含了dist文件夹, node_modules,server.js等文件,这些都是部署到服务器需要的文件, 删除后会重新生成新的文件, 然后一些第三方的依赖包也要重新下载,这就浪费了很多时间,因为大部分的第三方依赖包是没有什么变化的,所有我们应该保留release文件里面的node_modules文件, 每次只需要下载新的依赖包就可以了,这样会节省很多时间。

    //修改前的package.json, 删除了整个release文件夹
    "package": "rimraf release && yarn run build && gulp && (cd release && yarn install --prod && tar cvfz package.tar.gz * && mkdir package && mv package.tar.gz package)",
    
    //修改后的package.json, 删除了rimraf release, 保留了release文件夹
    "package": "yarn run build && gulp && (cd release && yarn install --prod && tar cvfz package.tar.gz * && mkdir package && mv package.tar.gz package)",
    
    //修改前的gulpfile.js, 清除整个release文件夹
    gulp.task('clean', () => del.sync(['release']))
    
    //修改后的gulpfile.js, 删除了release文件夹里面的除了node_modules以外的所有内容,这些被删除的文件会在build后重新生成。
    gulp.task('clean', function() {
      return del.sync(['release/**', '!release', '!release/node_modules', '!release/node_modules/**']);
    });
    
      • 效果
        效果比较明显,bulid time 减少了大约 20%-30%左右
  • 相关阅读:
    duilib基本框架
    字典树(Trie Tree)
    如何用java有选择的输入多行文本
    java 接口默认修饰符
    3org.springframework.beans.factory.BeanDefinitionStoreException异常
    mybatis
    大O表示法
    sql in interview for a job
    static
    StringBuffer 和 StringBuilder
  • 原文地址:https://www.cnblogs.com/qilj/p/12447464.html
Copyright © 2020-2023  润新知