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月3日 18:44
下一篇 2023年5月11日 23:17

相关推荐

  • 使用CSS的三种方式

    1.内联(Inline)方式 内联(Inline)方式,又称为行内方式。往往用于单个元素。 2.内部(Internal)方式 往往用于单个网页。 3.外部(External)方式 往往用于所有网页。 4.优先级 当同时存在多种使用 CSS 的方式时,如果为相同的选择器(元素)定义了相同的 CSS 属性名,则优先级如下:…

    JavaScript经验 2023年10月10日
    05150
  • innerHTML、outerHTML、textContent、innerText、outerText实例属性的区别

    1.innerHTML和outerHTML区别 类 实例属性 区别 Element innerHTML 目标元素标签之间的 HTML 代码,不包括目标元素标签本身。 Element outerHTML 目标元素标签之间的 HTML 代码,包括目标元素标签本身。 2.textContent和innerText区别 类 实…

    JavaScript经验 2023年10月15日
    05230
  • 开启JavaScript语言的严格模式

    要对一个脚本文件内的所有内容开启严格模式,只需要在脚本文件内的顶部添加 “use strict” 或 ‘use strict’ 即可。 要单独对一个函数体内的所有内容开启严格模式,只需要在函数体内的顶部添加 “use strict” 或 ‘use strict’ 即可。 注意:JavaScript 模块内的所有内容自动…

    JavaScript经验 2023年12月12日
    08940

发表回复

登录后才能评论