Nodejs中的require函数
说明
本⽂参考Node官⽹⽂档版本为v11.12.0。
本⽂主要分析了Nodejs中require导⼊JSON和js⽂件时得到的结果,同时简单涉及到了Nodejs中模块导出ports和exports的⽤法。
引⾔
在阅读webpack源码的过程当中,见到如下⼀⾏代码:
const version = require("../package.json").version
复制代码
故引申出对Nodejs中require的学习。
require介绍
在Node.js的⽂档中,require的相关⽂档是在Modules⽬录下,属于Nodejs模块化系统的⼀部分。
javascript说明require是⼀个函数。通过typeof或者String.call()可以验证这个结论:
console.log(require) // 输出:Function
console.log(String.call(require) // 输出:[object Function]
复制代码
通过直接打印require,可以发现在require函数下还挂载着若⼲个静态属性,这些静态属性也可以在Nodejs的官⽅⽂档中直接到相关的说明:
{ [Function: require]
resolve: { [Function: resolve] paths: [Function: paths] },
main:
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/bjhl/Documents/webpackSource/index.js',
loaded: false,
children: [],
paths:
[ '/Users/bjhl/Documents/webpackSource/node_modules',
'/Users/bjhl/Documents/node_modules',
'/Users/bjhl/node_modules',
'/Users/node_modules',
'/node_modules' ] },
extensions:
[Object: null prototype] { '.js': [Function], '.json': [Function], '.node': [Function] },
cache:
[Object: null prototype] {
'/Users/bjhl/Documents/webpackSource/index.js':
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/bjhl/Documents/webpackSource/index.js',
loaded: false,
children: [],
paths: [Array] } } }
复制代码
require函数静态属性
这⾥之后再详细补充。
require使⽤
在官⽹⽂档中可以看到如下关于require的说明:
require(id)#
Added in: v0.1.13
id module name or path
Returns: exported module content
Used to import modules, JSON, and local files. Modules can be imported from node_modules. Local
modules and JSON files can be imported using a relative path (e.g. ./, ./foo, ./bar/baz, ../foo) that will be resolved against the directory named by __dirname (if defined) or the current working directory.
同时还给出了三种require的使⽤⽅法:
// Importing a local module:
const myLocalModule = require('./path/myLocalModule');
// Importing a JSON file:
const jsonData = require('./path/filename.json');
// Importing a module from node_modules or Node.js built-in module:
const crypto = require('crypto');
复制代码
从以上⽂档中可以得出以下信息:
1. require接受⼀个参数,形参名为id,类型是String。
2. require函数return的是模块到处的内容,类型是任意。
3. require函数可以导⼊模块、JSON⽂件、本地⽂件。模块可以通过⼀个相对路径从node_modules、本地模块、JSON⽂件中导出,
该路径将针对__dirname变量(如果已定义)或者当前⼯作⽬录。
require实践
在这⾥将分类讨论require的实践结论。
require导⼊JSON
JSON 是⼀种语法,⽤来序列化对象、数组、数值、字符串、布尔值和 null 。
在⽂章的开头就提到了通过require("./package.json")⽂件来读取package.json⽂件中的version属性。这⾥将尝试导⼊info.json⽂件并查看相关信息。
⽂件结构⽬录如下:
.
├── index.js
└── info.json
复制代码
将info.json⽂件的内容修改为:
{
"name": "myInfo",
"hasFriend": true,
"salary": null,
"version": "v1.0.0",
"author": {
"nickname": "Hello Kitty",
"age": 20,
"friends": [
{
"nickname": "snowy",
"age": 999
}
]
}
}
复制代码
在info.json当中,包含了字符串、布尔值、null、数字、对象和数组。
将index.js的内容修改如下并在当前terminal运⾏命令node index.js,得到如下结果:
const info = require("./info.json")
console.log(String.call(info)) // [object Object]
console.log(info.version) // v1.0.0
console.log(info.hasFriend) // true
console.log(info.salary) // null
console.log(info.author.nickname) // Hello Kitty
console.log(info.author.friends) // [ { nickname: 'snowy', age: 999 } ]
复制代码
可以看到,require导⼊⼀个JSON⽂件的时候,返回了⼀个对象,Nodejs可以直接访问这个对象⾥的所有属性,包括String、Boolean、Number、Null、Object、Array。个⼈猜测这⾥可能⽤到了类似于JSON.parse()的⽅法。
通过这个结论也得出了⼀种思路,即通过require⽅法传⼊JSON⽂件来读取某些值,如在⽂章开头中,webpack通过读取package.json⽂件获取到了version值。
require导⼊本地js⽂件
⽂件结构⽬录如下:
.
├── index.js
├── module_a.js
└── module_b.js
复制代码
index.js⽂件中,分别按顺序导⼊了module_a和module_b并赋值,然后将这两个变量打印,内容如下:
console.log("*** index.js开始执⾏ ***")
const module_a = require("./module_a")
const module_b = require("./module_b")
console.log(module_a, "*** 打印module_a ***")
console.log(module_b, "*** 打印module_b ***")
console.log("*** index.js结束执⾏ ***")
复制代码
module_a⽂件中,未指定ports或者exports,但是添加了⼀个异步执⾏语句setTimeout,内容如下:
console.log("** module_a开始执⾏ **")
let name = "I'm module_a"
setTimeout(() => {
console.log(name, "** setTimeout打印a的名字 **")
}, 0)
console.log("** module_a结束执⾏ **")
复制代码
module_b⽂件中,指定了ports(也可以换成exports.name,但是不能直接使⽤exports等于某个对象,因为exports和ports其实是指向了⼀个地址,引⽤了相同的对象,如果使⽤exports等于其他的引⽤类型,则不再指向ports,⽆法改变ports⾥的内容),内容如下:
console.log("** module_b开始执⾏ **")
let name = "I'm module_b"
console.log(name, "** 打印b的名字 **")
name
}
console.log("** module_b结束执⾏ **")
复制代码
在当前⽬录terminal下运⾏node index.js运⾏得到如下输出:
*** index.js开始执⾏ ***
** module_a开始执⾏ **
** module_a结束执⾏ **
** module_b开始执⾏ **
I am module_b ** 打印b的名字 **
** module_b结束执⾏ **
{} '*** 打印module_a ***'
{ name: 'I am module_b' } '*** 打印module_b ***'
*** index.js结束执⾏ ***
I am module_a ** setTimeout打印a的名字 **
复制代码
通过以上执⾏结果可以得出结论:
1. require某个js⽂件时,如果未通过exports或者ports指定导出内容,则require返回的结果是⼀个空对象;反之可以通过
2. require某个js⽂件时,该⽂件会⽴即sync执⾏。
require导⼊模块
我们先选择⼀个npm包——cors。 进⼊⽂件夹,运⾏⼀下命令:
npm init -y // 初始化
echo -e "let cors = require(\"cors\")\nconsole.log(cors)" > index.js // ⽣成index.js⽂件
npm install cors --save // 安装cors包
复制代码
⽂件结构如下(...处省略了其他的模块):
.
├── index.js
├── node_modules
│├── cors
││├── CONTRIBUTING.md
││├── HISTORY.md
││├── LICENSE
││├── README.md
││├── lib
│││└── index.js
││└── package.json
││ ...
├── package-lock.json
└── package.json
复制代码
index.js中的内容如下:
let cors = require("cors")
console.log(cors)
复制代码
运⾏node index.js,得出以下结果:
[Function: middlewareWrapper]
复制代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论