Skip to content
目录

webpack

loader

可以将不同类型的文件转换为模块(Module),使得Webpack能够通过import语句来引入这些文件,例如ES6、TypeScript、CSS、图片等等。同时,在转换过程中,还可以对文件进行一些处理,例如压缩、提取等等

plugin

可以通过钩子函数来对整个Webpack构建流程进行扩展和定制。例如,对于优化性能,可以使用UglifyJsPlugin来压缩输出文件总体积,通过SplitChunksPlugin来获取更好的缓存和加载性能;对于处理静态资源,可以使用ImageminPlugin来压缩图片,使用HtmlWebpackPlugin来自动将生成的JS、CSS等文件注入到HTML文件中

loader和plugin的区别

  • loader是用来加载某些资源文件
  • plugin是用来扩展webpack的功能,是一个具有apply属性的js对象,通过webpack的钩子机制实现

针对不同项目优化

在大型单页应用(SPA)中,应该有限考虑代码分割,使用异步加载的方式降低首屏渲染时间,对于多页应用(MPA)则可以使用SplitChunksPlugin进行资源拆分,减少冗余加载;对于响应式的应用程序,则应该考虑使用responsive-loader、postcss-px-to-viewport等插件来优化移动端的用户体验

构建流程

  • 初始化参数:从配置文件和shell语句中读取与合并参数,得出最终的参数
  • 开始编译:用上一步得到的参数初始化compiler对象,加载所有配置的插件,执行对象的run方法开始执行编译
  • 确定入口:根据配置中的entry找出所有的入口文件
  • 编译模块:从入口文件出发,调用所有配置的loader对模块进行编译,再找出该模块依赖的模块,递归直到所有入口依赖的文件都经过了本步骤的处理
  • 完成模块编译:在经过第四步使用loader翻译完所有模块后,得到了每个模块被翻译后的最终内容以及他们之间的依赖关系
  • 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的chunk,再把每个chunk转换成一个单独的文件加入到输出列表,这步是可以修改输出内容的最后机会
  • 输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统

热更新原理

  • webpack-dev-server启动一个express服务器
  • webpack编译打包生成bundle.js
  • webpack-dev-server通过sockjs(websocket)和浏览器建立一个websocket长连接,将webpack编译打包的各个阶段的状态信息告知浏览器
  • 当webpack检测到文件变化后,会重新编译打包,并将打包后的信息告知浏览器
  • 浏览器根据收到的新模块代码,通过hot.replace对变更的模块进行替换,并且对变更的模块进行重新渲染

优化

  • 优化webpack的构建速度
    • 优化babel-loader的include和exclude,让其不要去处理不需要的文件
    • 使用HappyPack,将loader的同步执行转换为并行的
    • 使用DllPlugin和DllReferencePlugin预编译资源模块,将其打包成一个个单独的动态链接库,再通过DllReferencePlugin将其引入
    • 使用webpack-parallel-uglify-plugin开启多进程压缩js文件
    • 使用webpack.DllPlugin和webpack.DllReferencePlugin预编译资源模块,将其打包成一个个单独的动态链接库,再通过DllReferencePlugin将其引入
    • 使用webpack.DllPlugin和webpack.DllReferencePlugin预编译资源模块,将其打包成一个个单独的动态链接库,再通过DllReferencePlugin将其引入
    • 使用webpack.DllPlugin和webpack.DllReferencePlugin预编译资源模块,将其打包成一个个单独的动态链接库,再通过DllReferencePlugin将其引入
  • 优化webpack的输出结果
    • 使用CommonsChunkPlugin提取公共代码
    • 使用webpack.optimize.ModuleConcatenationPlugin作用域提升
    • 使用Tree-shaking和UglifyJsPlugin去除无用代码和压缩代码
    • 使用webpack.optimize.AggressiveSplittingPlugin分割代码
    • 使用webpack.optimize.LimitChunkCountPlugin限制chunk的数量
    • 使用webpack.optimize.MinChunkSizePlugin限制chunk的最小大小
    • 使用compression-webpack-plugin开启gzip压缩
    • 使用extract-text-webpack-plugin分离css和js文件

vite

vite和webpack的区别

  • vite是基于浏览器原生ES imports的开发服务器,利用浏览器去解析import的模块,所以服务端不需要做任何额外的工作,只需要用koa等启动一个http服务器,然后把一切交给浏览器去处理
  • webpack是一个打包工具,会将所有的资源模块打包成一个或多个bundle.js文件,浏览器不能直接运行ES Module,所以还需要一个翻译它们的工具,比如babel,将ES Module转换成CommonJS,再运行在浏览器中

be someone