Node.js风格的CommonJS模块

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

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2023年3月4日 22:04
下一篇 2023年5月11日 23:17

相关推荐

发表回复

登录后才能评论