[关闭]
@jsongao98 2021-04-24T12:18:27.000000Z 字数 5381 阅读 59

Webpack

工具


npm intasll webpack webpack-cli(可以在命令行中使用webpack命令)
npm i ..@版本号
npm info webpack
npx webpack -v(文件内查看版本信息,不建议-g全局安装webpack)


模块化

CommonJS规范:

  1. 导出:module.exports = 变量,对象;
  2. 导入:const xx = require('路径')

ES6语言级的模块系统:

  1. import obj as name from ('')/ export name as name2
  2. export default{}
  3. 具名导出需要{}导入 ,默认导出 不需要{}
  4. export .. from ('')
  5. //动态引入,返回一个Promise对象,运行时才执行,属于异步加载
  6. import() 常见写法:() => import('...')

区别:https://zhuanlan.zhihu.com/p/113009496


ES Module


webpack流程

构建工具(通过webpack(生成根文件下的dist目录)、webpack-dev-server(默认生成build/dist)打包)做以下这些事儿:


不同环境下的打包


概念

在webpack中借助babel-loader,项目中配置文件

  1. //webpack.config.js
  2. modules:{
  3. rules:[
  4. {test: /\.js$/,
  5. loader: "babel-loader",
  6. include: [
  7. resolve("src"),
  8. resolve("test"),
  9. resolve("node_modules/webpack-dev-server/client"),
  10. ],
  11. exclude:
  12. },
  13. ...]
  14. }
  1. //webpack.prod.conf.js
  2. optimization:{
  3. usedExports: true;//可以不写,mode:production 自动treeshaking
  4. }
  5. //package.json
  6. sideEffects:['@babel/polly-fill''*.css']//没有exports属性但被某些模块引入的工具、文件,在这配置不被treeshaking
  7. sideEffects:false;//所有文件都会被treeshaking
  1. //...声明webpackChunkName为打包后生成的bundle的名字
  2. import(/*webpackChunkName:lodash*//* webpackPreload: true */ 'lodash');

webpack与vite区别(development)

webpack原理图
此处输入图片的描述
webpack会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。

vite原理图
此处输入图片的描述
而vite是直接启动开发服务器,请求哪个模块再对该模块进行实时编译。

由于现代浏览器本身就支持ESModule,会自动向依赖的Module发出请求。vite充分利用这一点,将开发环境下的模块文件,就作为浏览器要执行的文件,而不是像webpack那样进行打包合并。

由于vite在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译。这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite的优势越明显。

在HMR(热更新)方面,当改动了一个模块后,仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。

当需要打包到生产环境时,vite使用传统的rollup(也可以自己手动安装webpack来)进行打包,因此,vite的主要优势在开发阶段。另外,由于vite利用的是ESModule,因此在代码中(除了vite.config.js里面,这里是node的执行环境)不可以使用CommonJS

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注