美文网首页webpack技术前端开发那些事儿
前端面试题:webpack 做过哪些优化,开发效率方面、打包策略

前端面试题:webpack 做过哪些优化,开发效率方面、打包策略

作者: 魂斗驴 | 来源:发表于2021-04-30 09:23 被阅读0次

    1)优化 Webpack 的构建速度

    使用高版本的 Webpack (使用webpack4)
    多线程/多实例构建:HappyPack(不维护了)、thread-loader
    缩小打包作用域:
    exclude/include (确定 loader 规则范围)
    resolve.modules 指明第三方模块的绝对路径 (减少不必要的查找)
    resolve.extensions 尽可能减少后缀尝试的可能性
    noParse 对完全不需要解析的库进行忽略 (不去解析但仍会打包到 bundle 中,注意被忽略掉的文件里不应该包含 import、require、define 等模块化语句)
    IgnorePlugin (完全排除模块)
    合理使用alias
    充分利用缓存提升二次构建速度:
    babel-loader 开启缓存
    terser-webpack-plugin 开启缓存
    使用 cache-loader 或者 hard-source-webpack-plugin
    注意:thread-loader 和 cache-loader 兩個要一起使用的話,請先放 cache-loader 接著是 thread-loader 最後才是 heavy-loader
    DLL:
    使用 DllPlugin 进行分包,使用 DllReferencePlugin(索引链接) 对 manifest.json 引用,让一些基本不会改动的代码先打包成静态资源,避免反复编译浪费时间。

    2)优化 Webpack 的打包体积

    压缩代码
    webpack-paralle-uglify-plugin
    uglifyjs-webpack-plugin 开启 parallel 参数 (不支持ES6)
    terser-webpack-plugin 开启 parallel 参数
    多进程并行压缩
    通过 mini-css-extract-plugin 提取 Chunk 中的 CSS 代码到单独文件,通过optimize-css-assets-webpack-plugin插件 开启 cssnano 压缩 CSS。
    提取页面公共资源:
    使用 html-webpack-externals-plugin,将基础包通过 CDN 引入,不打入 bundle 中
    使用 SplitChunksPlugin 进行(公共脚本、基础包、页面公共文件)分离(Webpack4内置) ,替代了 CommonsChunkPlugin 插件
    基础包分离:将一些基础库放到cdn,比如vue,webpack 配置 external是的vue不打入bundle
    Tree shaking
    purgecss-webpack-plugin 和 mini-css-extract-plugin配合使用(建议)
    打包过程中检测工程中没有引用过的模块并进行标记,在资源压缩时将它们从最终的bundle中去掉(只能对ES6 Modlue生效) 开发中尽可能使用ES6 Module的模块,提高tree shaking效率
    禁用 babel-loader 的模块依赖解析,否则 Webpack 接收到的就都是转换过的 CommonJS 形式的模块,无法进行 tree-shaking
    使用 PurifyCSS(不在维护) 或者 uncss 去除无用 CSS 代码
    Scope hoisting
    构建后的代码会存在大量闭包,造成体积增大,运行代码时创建的函数作用域变多,内存开销变大。Scope hoisting 将所有模块的代码按照引用顺序放在一个函数作用域里,然后适当的重命名一些变量以防止变量名冲突
    必须是ES6的语法,因为有很多第三方库仍采用 CommonJS 语法,为了充分发挥 Scope hoisting 的作用,需要配置 mainFields 对第三方模块优先采用 jsnext:main 中指向的ES6模块化语法
    图片压缩
    使用基于 Node 库的 imagemin (很多定制选项、可以处理多种图片格式)
    配置 image-webpack-loader
    动态Polyfill
    建议采用 polyfill-service 只给用户返回需要的polyfill,社区维护。(部分国内奇葩浏览器UA可能无法识别,但可以降级返回所需全部polyfill)
    @babel-preset-env 中通过useBuiltIns: 'usage参数来动态加载polyfill。
    3)speed-measure-webpack-plugin
    简称 SMP,分析出 Webpack 打包过程中 Loader 和 Plugin 的耗时,有助于找到构建过程中的性能瓶颈。

    转载

    相关文章

      网友评论

        本文标题:前端面试题:webpack 做过哪些优化,开发效率方面、打包策略

        本文链接:https://www.haomeiwen.com/subject/hjpgrltx.html