浅谈webpack优化

水深无声 2021-11-05 09:10 482阅读 0赞

webpack优化方案

1. 优化开发体验

1-1. 加快构建速度

  1. 缩小文件搜索范围
  • 由于 Loader 对文件的转换操作很耗时,需要让尽可能少的文件被 Loader 处理,用include和exclude去缩小;
  • resolve.modules用于配置 Webpack 去哪些目录下寻找第三方模块:[path.resolve(__dirname, ‘node_modules’)](根目录下);

  • resolve.mainFields用于配置第三方模块使用哪个入口文件:[‘mian’];

  • resolve.alias配置项通过别名来把原导入路径映射成一个新的导入路径:[path.resolve(__dirname, ‘./node_modules/react/dist/react.min.js’)];
  • resolve.extensions用于配置在尝试过程中用到的后缀列表:[‘js’, ‘json’];
  • module.noParse配置项可以让 Webpack 忽略对部分没采用模块化的文件的递归解析处理:[/react\.min\.js$/];

    ② HappyPack

  • HappyPack 的核心原理就是把loader转换任务分解到多个进程去并行处理,从而减少了总的构建时间;

    ③ ParallelUglifyPlugin

  • 压缩js代码需要先把代码解析成用 Object 抽象表示的 AST 语法树,再去应用各种规则分析和处理 AST;

  • ParallelUglifyPlugin会开启多个子进程,把对多个文件的压缩工作分配给多个子进程去完成,每个子进程其实还是通过 UglifyJS 去压缩代码,但是变成了并行执行;

1-2. 提升开发效率

  1. 自动刷新(webpack 模块负责监听文件,webpack-dev-server 模块则负责刷新浏览器)
  • 文件监听(—watch或watch: true),原理是定时的去获取这个文件的最后编辑时间,每次都存下最新的最后编辑时间,如果发现当前获取的和最后一次保存的最后编辑时间不一致,就认为该文件发生了变化;
  • 优化文件监听:watchOptions: {ignored: /node_modules/};
  • 自动刷新原理是往要开发的网页中注入代理客户端代码,通过代理客户端向DevServer 发起的 WebSocket 连接去刷新整个页面;
  • devServer.inline是用来控制是否往 Chunk 中注入代理客户端的,默认会注入;在你关闭了 inline 后,DevServer 会自动地提示你通过新网址 http://localhost:8080/webpack-dev-server/ 去访问;

    ② 模块热替换

  • 模块热替换的原理和自动刷新原理类似,都需要往要开发的网页中注入一个代理客户端用于连接 DevServer 和网页, 不同在于模块热替换独特的模块替换机制;

2. 优化输出质量

2-1. 减少加载时间

  1. 区分环境
  • process.env.NODE_ENV

    ② 压缩代码

    ③ CDN加速

  • 针对 HTML 文件:不开启缓存,把 HTML 放到自己的服务器上,而不是 CDN 服务上,同时关闭自己服务器上的缓存。自己的服务器只提供 HTML 文件和数据接口;

  • 针对静态的 JavaScript、CSS、图片等文件:开启 CDN 和缓存,上传到 CDN 服务上去,同时给每个文件名带上由文件内容算出的 Hash 值;

    ④ tree shaking

  • 让 Tree Shaking 正常工作的前提是交给 Webpack 的js代码必须是采用 ES6 模块化语法的, 因为 ES6 模块化语法是静态的(导入导出语句中的路径必须是静态的字符串,而且不能放入其它代码块中),这让 Webpack 可以简单的分析出哪些export的被import过了

    ⑤ 提取公共代码(CommonsChunkPlugin)

    ⑥ 按需加载

2-2. 提升流畅度

  1. Prepack
  • 通过 Babel 把 JavaScript 源码解析成抽象语法树(AST),以方便更细粒度地分析源码;
  • Prepack 实现了一个 JavaScript 解释器,用于执行源码。借助这个解释器 Prepack 才能掌握源码具体是如何执行的,并把执行过程中的结果返回到输出中。

    ② Scope Hoisting

webpack构建流程

  1. 初始化(启动构建,读取并合并配置参数,加载plugin,实例化compiler)
  2. 编译(entry出发,针对每个module引用loader解析,依次找到module依赖,然后递归)
  3. 输出(对编译后的module组合成chunk,转换成文件,输出)
  4. 文件变化,转到step2;

转载于:https://www.cnblogs.com/colima/p/8726874.html

发表评论

表情:
评论列表 (有 0 条评论,482人围观)

还没有评论,来说两句吧...

相关阅读

    相关 webpack入门

    在webpack看来,所有的资源文件都是模块,只是处理的方式不同。 webpack解决的需求点是:如何更好地加载前端模块。 一、首先以一个最简单的实例体验一下最简单的web

    相关 前端性能优化

    1、什么是前端性能优化? 从用户访问资源到资源完整展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度。   2、为什么

    相关 索引优化

    索引的优化 一:应用场景(千万条数据) 说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行个正确的’create index’,查

    相关 webpack打包原理

    浅谈webpack打包原理 模块化机制 webpack并不强制你使用某种模块化方案,而是通过兼容所有模块化方案让你无痛接入项目。有了webpack,你可以随意选择你

    相关 SQL优化

    SQL优化方案 在我们书写SQL语句的时候,其实书写的顺序、策略会影响到SQL的性能,虽然实现的功能是一样的,但是它们的性能会有些许差别。 因此,下面就讲解在书写SQL