CommonJS 模块用于在服务器环境中使用,而 Node.js 使用了 CommonJS 模块的轻微修改版本,本文介绍 Node.js 风格的 CommonJS 模块。
模块就是以 .js
为扩展名的 JavaScript 文件。
普通脚本文件内的顶级的成员对其它脚本文件来说是公开(public)的全局上下文,而模块文件内的顶级的模块成员对其它模块文件来说都是私有(private)的,所以首先需要在模块中将它们显式导出,然后在其它模块中显式导入它们才可以使用。
1.导出(module.exports)
Node.js 通过将需要导出的模块成员赋值给 module.exports
来实现导出。module.exports
的值的类型为 Object
。
同一个模块中可同时存在多个 module.exports = 值;
,但后面的 module.exports
会覆盖前面的 module.exports
。
注意:module.exports
语句必须位于模块文件内的顶级。
1.1导出一个对象字面量
module.exports
的值为一个对象字面量,对象字面量的属性则为需要导出的模块成员。
//前缀方式
//前面的module.可以省略。
//命名类表达式
[module.]exports.类名 = class 类名2 {
//类体
};
//匿名类表达式
[module.]exports.类名 = class {
//类体
};
//变量
[module.]exports.变量名;
[module.]exports.变量名 = 值;
//常量
[module.]exports.常量名 = 值;
//命名函数表达式
[module.]exports.函数名 = function 函数名2(形参) {
//函数体
};
//匿名函数表达式
[module.]exports.函数名 = function (形参) {
//函数体
};
//箭头函数表达式
[module.]exports.函数名 = (形参) => {
//函数体
};
//末尾方式
//前面的module.不可以省略。
//类声明
class 类名 {
//类体
}
//命名类表达式
{let | const} 类名 = class 类名2 {
//类体
};
//匿名类表达式
{let | const} 类名 = class {
//类体
};
//变量
let 变量名;
let 变量名 = 值;
//常量
const 常量名 = 值;
//函数声明
function 函数名(形参) {
//函数体
}
//命名函数表达式
{let | const} 函数名 = function 函数名2(形参) {
//函数体
};
//匿名函数表达式
{let | const} 函数名 = function (形参) {
//函数体
};
//箭头函数表达式
{let | const} 函数名 = (形参) => {
//函数体
};
//导出
module.exports = { 类名, 变量名, 常量名, 函数名 };
//注意:不支持此语法。
module.exports = { 字面量 };
1.2导出一个模块成员
module.exports
的值为一个模块成员。
//前缀方式
//命名类表达式
module.exports = class 类名 {
//类体
};
//匿名类表达式
module.exports = class {
//类体
};
//命名函数表达式
module.exports = function 函数名(形参) {
//函数体
};
//匿名函数表达式
module.exports = function (形参) {
//函数体
};
//箭头函数表达式
module.exports = (形参) => {
//函数体
};
//字面量
module.exports = 字面量;
//末尾方式
//类声明
class 类名 {
//类体
}
//命名类表达式
{let | const} 类名 = class 类名2 {
//类体
};
//匿名类表达式
{let | const} 类名 = class {
//类体
};
//变量
let 变量名;
let 变量名 = 值;
//常量
const 常量名 = 值;
//函数声明
function 函数名(形参) {
//函数体
}
//命名函数表达式
{let | const} 函数名 = function 函数名2(形参) {
//函数体
};
//匿名函数表达式
{let | const} 函数名 = function (形参) {
//函数体
};
//箭头函数表达式
{let | const} 函数名 = (形参) => {
//函数体
};
module.exports = 类名;
module.exports = 变量名;
module.exports = 常量名;
module.exports = 函数名;
module.exports = 字面量;
module.exports = new 类名();
2.导入(require)
let 变量名 = require('模块标识符');
const 常量名 = require('模块标识符');
require()
函数的返回值是 '模块标识符'
导出的模块成员。
//模块标识符格式
//绝对路径
require('/module.js');
//相对路径
require('./module.js');
require('../module.js');
//Node.js内置模块
require('node:module');
//npm包(目录)内模块
require('包名');
注意:require()
语句非必须位于模块文件内的顶级,可以嵌套到其它语句内。
注意:require()
语句非必须位于模块文件内的顶部。
注意:另一个模块无论在同一个模块中被导入多少次,实际上只会被导入一次。
2.1返回值为一个对象字面量
//方式一(直接将对象字面量赋值给变量名或常量名)
let 变量名 = require('模块标识符');
const 常量名 = require('模块标识符');
//方式二(使用解构赋值只导入打算使用的模块成员)
let { 类名, 变量名, 常量名, 函数名 } = require('模块标识符');
const { 类名, 变量名, 常量名, 函数名 } = require('模块标识符');
2.2返回值为一个模块成员
//直接将对象字面量赋值给变量名或常量名
let 变量名 = require('模块标识符');
const 常量名 = require('模块标识符');
2.3导入模块运行的结果
require('模块标识符');
无论 '模块标识符'
有没有模块成员的导出,并不会导入任何模块成员,而是将模块运行的结果作为另一个模块的一部分,而不是将模块内的代码作为另一个模块的一部分。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/javascriptexp/21371.html