首页 > 语言 > JavaScript > 正文

浅析node.js的模块加载机制

2024-05-06 15:33:54
字体:
来源:转载
供稿:网友

在node.js中,模块使用CommonJS规范,一个文件是一个模块

node.js中的模块可分为三类

    内部模块 - node.js提供的模块如 fs,http,path等 自定模块 - 我们自己写的模块 第三方模块 - 通过npm安装的模块

node.js提供了大量的模块供我们使用,比如 想解析一个文件的路径,可以使用path模块下的相应方法实现:

const path = require('path');//返回目标文件的绝对路径console.log(path.resolve('./1.txt'));

运行结果:

/Users/cuiyue/workspace/test/1.txt

使用require引入相应的模块,即可使用。

__dirname和__filename

node.js的每个模块都有这两个参数,它们都是一个绝对路径的地址,区别是__filename存放了从根目录到当前文件名的路径,__dirname只存放从根目录到模块的所在目录:

console.log(__dirname);console.log(__filename);

运行结果:

/Users/cuiyue/workspace/test
/Users/cuiyue/workspace/test/module.js

vm模块

vm模块是node.js提供在V8虚拟机中编译和运行的工具,node.js中的模块内部实现就是通过此模块完成。

说说vm的基本用法。

在js环境中有一个eval函数,它可以运行js的代码字符串,比如:

eval('console.log("Hello javascript.")'); //输出Hello javascript.

可以看到,eval函数的参数是一段字符串,它可以运行字符串形式的js代码,但它可以使用上下文环境中的变量:

var num=100;eval('console.log(num)'); //输出100

以上是可以正确访问num的值。

vm模块提供了方法创建一个安全的沙箱,在指定的上下文环境中运行代码,不受外界干扰。

const vm = require('vm');var num = 100;vm.runInThisContext('console.log(num)');

运行结果:

console.log(num)
            ^
ReferenceError: num is not defined

可以看到代码报错了,说明在vm创建了指定的上下文环境中,拿不到外界的参量。

CommonJS规范

在以前,由于javascript的历史原因导致它的模块机制很差,由于这些缺点使得javascript不太善于开发大型应用,于是提出了CommonJS规范以弥补javascript的不足。

CommonJS规范主要分为三块内容:模块导入导出、模块定义、模块标识。

模块导入导出

CommonJS中使用require()函数进行模块的引入。

const mymodule = require('mymodule');

使用exports导出模块

module.exports = {  name: 'Tom'};

引用的名称可以不带路径,若不带路径表示引入的是node提供的模块或是npm安装的第三方模块(node_modules)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选