1、模块化
Common JS (CMJ)社区标准ES Module (ESM)官方标准
Common JS
基本知识:
- 只能用于
node环境,无法在浏览器环境中使用; - 每一个
js文件都是一个模块,通过node命令运行的模块(文件)被称为入口模块; - 在
node环境中,每一个模块中的全局变量、函数不会造成全局污染; require方法中的路径必须以./或../开头;require方法的逻辑:运行导入的js代码,返回值为js文件中导出的内容;- 模块导出的内容有缓存,后续如再次导入模块,则直接使用缓存,不会执行
js文件; - 只支持动态依赖。
ES Module
基本知识:
- 支持
node环境和浏览器环境; - 通过
script标签导入的js文件,设置标签type属性为module,那么这个js文件会被认为是一个模块,符合ES Module标准,其中的全局变量、函数不会造成全局污染; - 与
Common JS一样也有导入的缓存; - 支持动态依赖和静态依赖。
导出方式:
- 具名导出:
使用 export 关键字加函数/变量的定义/声明语句导出。
代码示例:
export const a = 1;
export function fnc () { ... };
// export 不能直接导出表达式,所以函数/变量表达式导出要用 {} 括起来,并不表示对象
const num = 1;
export { num };
// 使用别名导出变量/函数
export { num as index };
- 默认导出:
使用 export default 关键字加表达式导出。
代码示例:
export default 3;
export default function fnc () { ... };
const num = 1;
export { num as default };
可以把导出的内容当作一个对象,default 是其中特殊的一个键。
注意:default 只能导出一次,后续再次默认导出无效,不会覆盖前值。
动态依赖:
除了上述的静态依赖,ES Module 还支持导入动态依赖。
所谓动态依赖,就是在执行代码后才会导入其它模块,而静态依赖在编译阶段就会分析出模块之间的依赖关系。
通过 import 方法可以实现在代码中动态地导入其它模块。
import 方法返回一个 Promise 对象,Promise 对象的成功回调中返回导入的模块对象。
2、CLI 小工具
- CLI 小工具,即命令行小工具。没有全局安装的依赖提供的命令并不能在命令行中直接运行,但可以通过
npx(npx是npm提供的命令小工具) 运行,或通过脚本运行。例如:
// 本地安装 less 库会提供 lessc 命令工具,但直接执行会报错,找不到
lessc xxx xxx
// 使用 npx 可正确运行
npx lessc xxx xxx
// 通过 package.json 中的脚本也可正确运行
scripts: {
"xxx": "lessc xxx xxx"
}
npm run xxx