@jsongao98
2021-04-24T12:18:27.000000Z
字数 5381
阅读 59
工具
npm intasll webpack webpack-cli(可以在命令行中使用webpack命令)
npm i ..@版本号
npm info webpack
npx webpack -v(文件内查看版本信息,不建议-g全局安装webpack)
CommonJS规范:
导出:module.exports = 变量,对象;
导入:const xx = require('路径')
ES6语言级的模块系统:
import obj as name from ('')/ export name as name2
export default{}
具名导出需要{}导入 ,默认导出 不需要{}
export .. from ('')
//动态引入,返回一个Promise对象,运行时才执行,属于异步加载
import() 常见写法:() => import('...')
区别:https://zhuanlan.zhihu.com/p/113009496
CommonJS 模块输出的是一个值的拷贝(基础类型的复制和引用类型的浅拷贝)(可以被缓存起来,下次require就直接调用),ES6 模块直接输出的是值的引用
//如何解决让CommonJS导出的模块也能改变其内部变量
var counter = 3;
function incCounter() {
counter++;
}
module.exports = {
get counter() {
return counter
},
incCounter: incCounter,
};
module.exports:exports是module.exports的引用,如果exports没有重赋值,则二者没有任何区别
),ES6Module可以导出多个(即导出多个接口,但我们引用的时候就比较麻烦,比如import ..(*) as .. from ...
,如果我们导出时只定义一个默认接口,exports default{}
就方便了 ) <script type="module">
以使 import/export 可以工作。ES模块(相较于常规脚本,比如webpack rollup打包出来的bundle.js,比如CommonJS模块都是普通脚本)有几点差别: 现代浏览器会自动加载并解析脚本。
补充:动态import()语句返回一个promise,可以配合async使用。
构建工具(通过webpack(生成根文件下的dist目录)、webpack-dev-server(默认生成build/dist)打包)做以下这些事儿:
<script>
。plugin: 是能够参与到compilation process的自定义函数,通过hook到每一个编译(compiler)中,触发关键事件或处理。
如何自定义webpack插件:
在webpack中借助babel-loader,项目中配置文件
//webpack.config.js
modules:{
rules:[
{test: /\.js$/,
loader: "babel-loader",
include: [
resolve("src"),
resolve("test"),
resolve("node_modules/webpack-dev-server/client"),
],
exclude:
},
...]
}
//webpack.prod.conf.js
optimization:{
usedExports: true;//可以不写,mode:production 自动treeshaking
}
//package.json
sideEffects:['@babel/polly-fill','*.css']//没有exports属性但被某些模块引入的工具、文件,在这配置不被treeshaking
sideEffects:false;//所有文件都会被treeshaking
//...声明webpackChunkName为打包后生成的bundle的名字
import(/*webpackChunkName:lodash*//* webpackPreload: true */ 'lodash');
webpack原理图
webpack会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。
vite原理图
而vite是直接启动开发服务器,请求哪个模块再对该模块进行实时编译。
由于现代浏览器本身就支持ESModule,会自动向依赖的Module发出请求。vite充分利用这一点,将开发环境下的模块文件,就作为浏览器要执行的文件,而不是像webpack那样进行打包合并。
由于vite在启动的时候不需要打包,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译。这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite的优势越明显。
在HMR(热更新)方面,当改动了一个模块后,仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。
当需要打包到生产环境时,vite使用传统的rollup(也可以自己手动安装webpack来)进行打包,因此,vite的主要优势在开发阶段。另外,由于vite利用的是ESModule,因此在代码中(除了vite.config.js里面,这里是node的执行环境)不可以使用CommonJS