Node.js学习一 —— 模块化

23 篇文章 0 订阅

模块化

(题外话,此系列默认您已有一些JS基础以及代码经验,关于nodejs的冗余介绍都被省略了,就从模块化开始吧)

加载模块

​ JS 并没有“脚本间贡献全局命名空间”这一特性。一旦JS代码被载入网页,就会添加进入全局命名空间。全局命名空间是被所有已载入的脚本所贡献的通用地址空间,这样不免会有一些安全问题、冲突以及一些难以跟踪和解决的一般性错误。

​ 不过,Node为服务器端的JS制定了一些规范,并且实现了CommonJS模块标准。这样,每个模块都拥有一个上下文来将其他模块隔离开,这意味着没有全局污染(根本就没有全局作用域)。

如何加载模块

​ Node中可以用文件路径也可以用名称来引用模块。如果不是核心模块,使用名称引用的模块都会被映射成文件路径(即等价)。

​ 不管什么模块,都可以使用require函数 引入:

var module = require('module_name')

​ 导入一个模块将返回一个对象。该对象表示模块对外暴露的API,根据模块不同,该对象可能是任意的JS值:函数、对象…

导出模块

​ 在Node中,CommonJS模块系统是文件之间共享对象、数据、函数等等之类的唯一方式。

​ 在Node中,文件和模块是一一对应的。

​ Feudalman.js文件:

function feudalman(x,y) {
    function add (x,y) {
        return x + y;
    }
    function sub (x,y) {
        return x - y;
    }
}

module.exports = feudalman;

​ 重点在于最后一行:module是一个变量,表示模块自身。而module.exports表示导出的对象(可以是任意对象)。module初始被定义为一个空对象。

​ 还可以导出多个对象:

module.exports.add = feudalman.add;
module.exports.sub = feudalman.sub;

​ 此时如果需要使用,则这么写(同目录下文件):

const mod = require('./Feudalman');
const res1 = mod.add(1,1);
const res2 = mod.sub(1,2);

加载模块

​ 引用模块的方式取决于模块类型——核心模块、第三方模块、本地模块。

核心模块

​ 核心模块只能通过模块名引用。如果有同名模块,核心模块加载优先级更高。

​ 例如,如果想加载http模块:

const http = require("http");

文件模块

​ 可以提供绝对路径从系统文件中加载非核心模块,如:

const x = require('/home/node/my_module/my_module');

​ 或者也可以使用相对路径定位项目中的模块,如上面引入Feudalman所写。

​ 注意,可以省略模块文件的拓展名.js,如果没有找到该文件,Node会在文件名后自己加上拓展名查找。

加载文件夹模块

​ 还可以使用文件夹路径加载模块:

const x = require('./myModule');

​ Node会假定该文件夹是一个包,并试图查找配置文件package.json

​ 如果没有配置文件,会默认入口为index.js

​ 相反,如果存在配置,就会解析配置文件找到入口。这个后面会讲到。

node_modules文价夹加载

​ 如果require传参不是上面的任何一种,那么Node就会尝试在当前目录下的node_modules下查找模块。如果没有找到,会自动去父级文件夹的node_modules中查找,直到根目录。

​ npm会自动帮你管理,所以不用操心包到底怎么放。

缓存模块

​ 模块在首次加载时会被缓存起来,这意味着如果模块名能被解析为相同的文件名,那么每次调用require('myModule')都会返回同一模块。

​ 举个例子就能理解了:

​ 创建一个模块,内容为:

console.log("init");
module.exports = function () {
    console.log("export!");
}
console.log("exported!");

​ 然后加载一次模块:

const myModule = require('./myModule');

​ 会输出initexported

​ 而加载两次:

const myModule = require('./myModule');
const myModule = require('./myModule');
最终发现打印结果和上面一模一样,也就是说,不会重复多次初始化同一个模块。

小结:

1. Node取消了JS默认的全局命名空间,而用CommonJS系统代替。
2. 不同的模块require的不同传参
3. 如何引用并使用模块
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Node.js中,模块是一种组织和管理代码的方式,它允许将代码拆分成多个模块,使得代码更可维护、可重用和可测试。以下是在Node.js中进行模块的几种常见方式: 1. CommonJS模块: - 使用`require`函数引入其他模块,例如:`const module = require('./module');` - 使用`module.exports`导出模块的功能,例如:`module.exports = { ... }` 示例: ```javascript // module.js const greeting = 'Hello'; function sayHello(name) { console.log(`${greeting}, ${name}!`); } module.exports = { sayHello }; ``` ```javascript // main.js const module = require('./module'); module.sayHello('John'); ``` 2. ES模块: - 使用`import`语句引入其他模块,例如:`import module from './module';` - 使用`export`关键字导出模块的功能,例如:`export function greet(name) { ... }` 注意:ES模块需要在Node.js版本12及以上才能原生支持。 示例: ```javascript // module.mjs const greeting = 'Hello'; function sayHello(name) { console.log(`${greeting}, ${name}!`); } export { sayHello }; ``` ```javascript // main.mjs import { sayHello } from './module.mjs'; sayHello('John'); ``` 3. 第三方模块: - 使用`npm`命令安装第三方模块,例如:`npm install module-name` - 使用`require`或`import`语句引入第三方模块,例如:`const module = require('module-name')`或`import module from 'module-name'` 示例: ```javascript // main.js const express = require('express'); const app = express(); ``` 这些是在Node.js中进行模块的常见方式。你可以根据自己的需求选择适合的模块方法来组织和管理代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧州刺史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值