node.js的模块化 与 CommonJS规范

一、node.js的模块化

(1)什么是模块化?

将一个复杂的程序文件依据一定的规则拆分成为多个文件的过程就是模块化

在node.js中,模块化是指把一个大文件拆分成独立并且相互依赖的多个小模块,将每个js文件被认为单独的一个模块;模块之间是互相不可见的,如果一个模块需要使用另一个模块,则需要使用指定的语法来引入模块,并且只能引入模块所暴露的内容

语法 : const 变量名 = require('模块的路径');

(2)什么是模块化项目?

编码是按照模块一个一个编码的,整个项目就是一个模块化的项目

(3)模块化的好处?

防止命名冲突、高复用性、高维护性

二、node.js的模块化代码初体验

(1)两种暴露数据的方式

方式一:module.exports=value
方式二:module.name=value

代码示例:我建两个文件夹

文件夹一的内容:

javascript 复制代码
// 调用初体验2.js里面的函数
// 一.导入模块
const first=require('./36-1初体验2');

// 二.调用函数
// 方式一:module.exports=value
// (1)调用函数first
first();
//输出结果为:我是初体验2里面的内容1
// (2)调用函数second、third
first.second();   
first.third();
//输出结果为:我是初体验2里面的内容2  我是初体验2里面的内容3

// 方式二:module.name=value
// (1)调用函数second、third
console.log(first);
//输出结果为:{ sc: [Function: second], th: [Function: third] }

文件夹二的内容:

javascript 复制代码
// 一、声明函数 下面我声明三个函数来依次举例:
function first(){
    console.log('我是初体验2里面的内容1');
}
function second(){
    console.log('我是初体验2里面的内容2');
}
function third(){
    console.log('我是初体验2里面的内容3');
}
// 二、暴露数据
// 方式一:module.exports=value
// (1)暴露数据first:
module.exports=first;   //我是初体验2里面的内容1
// (2)暴露数据second和third:
module.exports={
    second,
    third
}
// 方式二:module.name=value
// (1)暴露数据second和third:
exports.sc=second;
exports.th=third;

(2)注意点

1》module.exports可以暴露任何数据

文件夹two:

javascript 复制代码
module.exports="love";
module.exports="爱";
module.exports="520";

文件夹one

javascript 复制代码
const a=require('./two');
console.log(a);

分别将文件夹two的数据输出,运行文件夹one的结果显示:

2》不能使用exports=value的形式暴露数据

文件夹two:

javascript 复制代码
exports='love'

文件夹one:

javascript 复制代码
const a=require('./two');
console.log(a);

运行文件夹one的结果显示:

3》模块内部module与exports有隐式关系 exports=module.exports={ }

文件夹two:

javascript 复制代码
console.log(exports);
console.log(exports===module.exports);

运行文件夹two的结果显示:

三、 CommonJS规范

(1)什么是CommonJS规范?

CommonJS规范最初是为Node.js设计的,但现在也在其他环境中得到广泛应用。它用于模块化编程的一种标准。它提供了一种方式来定义模块,以及如何在不同的node.js环境中共享和重用这些模块。

CommonJS规范提供了一种简单而一致的方式来组织和管理node.js代码中的模块。这使得在不同环境中重用和共享代码变得更加容易

(2)关于CommonJS规范的一些关键操作

1.定义模块

在CommonJS中,每个文件都被视为一个模块。你可以通过module.exportsexports对象来导出模块的公共API。

module.exports、exports、require..都是模块化规范中的内容。

node.js实现了CommonJS模块化规范,它们二者关系就等同于javascript与ECMAScript

2.引入模块

使用require函数来引入其他模块

3.模块标识

在CommonJS中,模块的标识是文件的路径。当你使用require函数时,它会根据传入的路径来查找并加载相应的模块

4. 模块加载

当模块被首次require时,它会被加载并执行。CommonJS模块系统提供了同步加载的机制,这意味着在模块被加载之前,代码的执行会暂停

5. 模块缓存

一旦模块被加载,它就会被缓存起来。这意味着多次require同一个模块会返回第一次加载时的结果,而不是重新加载和执行模块

6.错误处理

如果require函数无法找到指定的模块,它会抛出一个错误。在Node.js中,这通常会导致进程退出

7. 模块系统扩展:

虽然CommonJS规范定义了模块的基本行为,但具体的实现可能会因环境而异。例如,Node.js提供了许多内置模块,如fshttp等,这些模块提供了与底层系统交互的功能

相关推荐
j喬乔24 分钟前
Node导入不了命名函数?记一次Bug的探索
typescript·node.js
z千鑫2 小时前
【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤
前端·vue.js·node.js
小马哥编程7 小时前
原型链(Prototype Chain)入门
css·vue.js·chrome·node.js·原型模式·chrome devtools
蜜獾云14 小时前
npm淘宝镜像
前端·npm·node.js
dz88i814 小时前
修改npm镜像源
前端·npm·node.js
CodeChampion19 小时前
61.基于SpringBoot + Vue实现的前后端分离-在线动漫信息平台(项目+论文)
java·vue.js·spring boot·后端·node.js·maven·idea
小王码农记20 小时前
解决npm publish发布包后拉取时一直提示 Couldn‘t find any versions for “包名“ that matches “版本号“
前端·npm·node.js
求知若饥1 天前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
理想不理想v2 天前
webpack最基础的配置
前端·webpack·node.js