工程化小记

69 阅读2分钟

1、模块化

  • Common JS (CMJ) 社区标准
  • ES Module (ESM) 官方标准

Common JS

基本知识

  1. 只能用于 node 环境,无法在浏览器环境中使用;
  2. 每一个 js 文件都是一个模块,通过 node 命令运行的模块(文件)被称为入口模块
  3. node 环境中,每一个模块中的全局变量、函数不会造成全局污染
  4. require 方法中的路径必须以 ./../ 开头
  5. require 方法的逻辑:运行导入的 js 代码,返回值为 js 文件中导出的内容
  6. 模块导出的内容有缓存,后续如再次导入模块,则直接使用缓存,不会执行 js 文件;
  7. 只支持动态依赖

ES Module

基本知识

  1. 支持 node 环境和浏览器环境;
  2. 通过 script 标签导入的 js 文件,设置标签 type 属性为 module,那么这个 js 文件会被认为是一个模块,符合 ES Module 标准,其中的全局变量、函数不会造成全局污染
  3. Common JS 一样也有导入的缓存
  4. 支持动态依赖静态依赖

导出方式

  1. 具名导出

使用 export 关键字加函数/变量的定义/声明语句导出。

代码示例:


export const a = 1;

export function fnc () { ... };

// export 不能直接导出表达式,所以函数/变量表达式导出要用 {} 括起来,并不表示对象
const num = 1;
export { num };

// 使用别名导出变量/函数
export { num as index };

  1. 默认导出

使用 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 小工具

  1. CLI 小工具,即命令行小工具没有全局安装的依赖提供的命令并不能在命令行中直接运行,但可以通过 npxnpxnpm 提供的命令小工具) 运行,或通过脚本运行。例如:
// 本地安装 less 库会提供 lessc 命令工具,但直接执行会报错,找不到
lessc xxx xxx

// 使用 npx 可正确运行
npx lessc xxx xxx

// 通过 package.json 中的脚本也可正确运行
scripts: {
    "xxx": "lessc xxx xxx"
}

npm run xxx