一. 模块化方案
1.cjs(commonjs)
commonjs
通过require
和exports
导入导出
可以运行在node环境中,不能直接再浏览器中使用
cjs 为动态加载,可直接 require 一个变量
2.AMD(Asynchronous Module Definition,即异步模块加载机制)
3.CMD和[UMD
CMD:与AMD一样解决异步问题
UMD:一直兼容CJS和AMD的方案
4.ESM()
在 Node 及 浏览器中均会支持。
esm为静态导入,可以在编译器进行Tree Shaking
,减少js体积
目前浏览器与node中均支持esm
- cjs的模块输出的是一个值的拷贝,esm的输出是值的引用
- cjs模块是运行时加载,esm是编译时加载
esm
执行步骤: 1.构建 2.实例化 3.运行
确定从哪里下载的模块文件 下载并将所有的文件解析为模块记录
将模块记录转换为一个模块实例,为所有的模块分配内存,依照导出导入语句把模块指向对应的内存地址
运行代码,将内存填充
vite快速的原因
1.ESM将压力放在浏览器上
2.esbuild+依赖预构建
预购建作用:
- bundler
预构建使用ESbuild
- transformer
编辑TSX/JSX
缺点:没有类型检查
- minifier
webpack
webpack Runtime分析
做了三件事:
__webpack_modules__
: 维护一个所有模块的数组 . 将入口模块解析为AST
,进行dfs并构建出所有的模块__webpack_require__(moduleId)
:手动加载一个模块,对已经加载的模块进行缓存,对未加载的模块执行id定位到__webpack_modules__
中的包裹函数,执行返回module.exports
,并缓存__webpack_require_(0)
运行入口模块 ```javascript const webpack_modules = [() => {}]; const webpack_require = (id) => { const module = { exports: {} }; const m = webpack_modulesid; return module.exports; };
webpack_require(0); ``` 言简意赅就是一个简单的记忆化搜索
webpack动态加载chunk
项目中vite基本配置
全局配置scss
vite打包优化
查看打包体积
npm i rollup-plugin-visualizer --save-dev
再使用npm run build
页面会出现一个stats.html
优化策略
cdn加速
将常用的库比如 axios vue-router 等替换成 cdn