JavaScript CommonJS:概述
JavaScript CommonJS 是一个模块化开发标准,旨在帮助开发者轻松创建和管理模块化代码。它提供了一套通用的 API,允许开发者将代码分解为独立的模块,并方便地在不同模块之间共享数据和函数。CommonJS 最初由 Mozilla 开发,但现在已被广泛应用于 Node.js、Webpack 等 JavaScript 构建工具中。
CommonJS 的基础知识
CommonJS 的核心概念是模块,模块是代码的一个独立单元,可以包含函数、变量和类等内容。模块之间通过 require() 函数进行通信,require() 函数的作用是加载指定模块并返回其导出的内容。
const mod = require("module-name");
console.log(mod.function());
上面的代码加载了名为 module-name 的模块,并调用了该模块导出的 function() 函数。
模块导出的内容可以通过 module.exports 或 exports 对象进行指定,module.exports 是一个特殊的对象,指向当前模块导出的内容,而 exports 则是 module.exports 的别名。
const mod = require("module-name");
console.log(mod.foo); // 输出: "bar"
const { foo } = require("module-name");
console.log(foo); // 输出: "bar"
上面的代码加载了名为 module-name 的模块,并分别通过 module.exports 和 exports 对象导出了 foo 变量。
CommonJS 的使用指南
创建模块
创建一个 CommonJS 模块非常简单,只需要创建一个 JavaScript 文件,并使用 module.exports 或 exports 对象导出需要共享的内容即可。
// module-name.js
const foo = "bar";
module.exports = { foo };
加载模块
要加载一个 CommonJS 模块,可以使用 require() 函数。require() 函数的参数是模块的名称,它会返回该模块导出的内容。
// main.js
const mod = require("./module-name");
console.log(mod.foo); // 输出: "bar"
导出函数
CommonJS 也支持导出函数,只需要将函数赋值给 module.exports 或 exports 对象即可。
// module-name.js
function foo() {
console.log("Hello, world!");
}
module.exports = foo;
// main.js
const mod = require("./module-name");
mod(); // 输出: "Hello, world!"
导出类
CommonJS 也支持导出类,只需要将类赋值给 module.exports 或 exports 对象即可。
// module-name.js
class Foo {
constructor() {
this.foo = "bar";
}
}
module.exports = Foo;
// main.js
const mod = require("./module-name");
const foo = new mod.Foo();
console.log(foo.foo); // 输出: "bar"
CommonJS 的常见问题解答
CommonJS 和 ES6 模块有什么区别?
CommonJS 和 ES6 模块是 JavaScript 的两种不同的模块化开发标准。CommonJS 早于 ES6 模块,因此它在语法和语义上都有所不同。
- 语法: CommonJS 模块的导出语法是 module.exports = {} 或 exports = {},而 ES6 模块的导出语法是 export {}。
- 语义: CommonJS 模块是立即执行的,而 ES6 模块是延迟执行的。这意味着 CommonJS 模块中的变量和函数在加载时就会被初始化,而 ES6 模块中的变量和函数只有在使用时才会被初始化。
- 兼容性: CommonJS 模块可以在 Node.js 中运行,而 ES6 模块则需要使用特殊的构建工具,如 Babel 或 TypeScript,才能在 Node.js 中运行。
如何在项目中使用 CommonJS 模块?
要在项目中使用 CommonJS 模块,需要先安装模块化打包工具,如 Webpack 或 Browserify。这些工具可以将 CommonJS 模块打包成可以在浏览器中运行的代码。
// package.json
{
"dependencies": {
"webpack": "^5.70.0",
"module-name": "^1.0.0"
}
}
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./main.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js"
},
module: {
rules: [
{
test: /.js$/,
loader: "babel-loader"
}
]
}
};
// main.js
const mod = require("./module-name");
console.log(mod.foo);