如何理解Node.js的模块系统,涉及哪些知识点
Admin 2022-08-16 群英技术资讯 859 次浏览
Nodejs 有一个简单的模块加载系统。在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是 JavaScript 代码,JSON 或编译过的C/C++ 扩展,例如:
/** *foo.js *将这个js文件导出为模块 */ exports.hello = function() { console.log("hello Nodejs!"); }
/** *main.js *main.js和foo.js在同一目录下 *在控制台中将会输出:hello Nodejs! */ var foo = require("./foo.js"); foo.hello();
二、如何将模块导出—— module.exports 与 exports 的区别
Nodejs 中的每一个模块都会自动创建一个 module 对象,同时 module 对象下有一个叫 exports 的属性,可以将某个类的实例赋值给 module.exports,从而导出这个类的实例。在模块被执行前,Nodejs 会将 module.exports 的值赋于全局变量 exports ,以便 module.exports.f = ... 可以更简洁的写成 exports.f = ... 。注意:就像所有变量一样,如果重新给 exports 赋值,它就不再绑定到 module.exports 了,也不会导出指定模块
例如:
/** *foo.js *导入方式:var foo = require("./foo.js"); */ function Foo() {} Foo.prototype.hello = function() { console.log("hello Nodejs!"); } module.exports = new Foo();
/** *foo.js *导入方式:var Foo = require("./foo.js"); var foo = new Foo(); */ function Foo() {} Foo.prototype.hello = function() { console.log("hello Nodejs!"); } module.exports = Foo;
/** *foo.js *导入方式:var foo = require("./foo.js"); */ exports.hello = function() { console.log("hello Nodejs!"); }
三、require的机制
假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理:
1、如果 X 是核心模块(例如:require("http"))
a.返回该模块
b.不再继续执行
2、如果Y是以“./”、“/”或“../”开头
a.把X当成文件,从指定路径开始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一个存在,就返回该文件,不再继续执行
b.把X当成目录,从指定路径开始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一个存在,就返回该文件,不再继续执行
3.如果 X 不是核心模块,也没有以“./”、“/”或“../”开头,则Nodejs会从当前模块的父目录开始,尝试从它的 /node_module 目录里加载模块,如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录
4.抛出“not found”
转自:https://www.cnblogs.com/blog-cxj2017522/p/7071840.html
Nodejs 有一个简单的模块加载系统。在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是 JavaScript 代码,JSON 或编译过的C/C++ 扩展,例如:
/** *foo.js *将这个js文件导出为模块 */ exports.hello = function() { console.log("hello Nodejs!"); }
/** *main.js *main.js和foo.js在同一目录下 *在控制台中将会输出:hello Nodejs! */ var foo = require("./foo.js"); foo.hello();
二、如何将模块导出—— module.exports 与 exports 的区别
Nodejs 中的每一个模块都会自动创建一个 module 对象,同时 module 对象下有一个叫 exports 的属性,可以将某个类的实例赋值给 module.exports,从而导出这个类的实例。在模块被执行前,Nodejs 会将 module.exports 的值赋于全局变量 exports ,以便 module.exports.f = ... 可以更简洁的写成 exports.f = ... 。注意:就像所有变量一样,如果重新给 exports 赋值,它就不再绑定到 module.exports 了,也不会导出指定模块
例如:
/** *foo.js *导入方式:var foo = require("./foo.js"); */ function Foo() {} Foo.prototype.hello = function() { console.log("hello Nodejs!"); } module.exports = new Foo();
/** *foo.js *导入方式:var Foo = require("./foo.js"); var foo = new Foo(); */ function Foo() {} Foo.prototype.hello = function() { console.log("hello Nodejs!"); } module.exports = Foo;
/** *foo.js *导入方式:var foo = require("./foo.js"); */ exports.hello = function() { console.log("hello Nodejs!"); }
三、require的机制
假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理:
1、如果 X 是核心模块(例如:require("http"))
a.返回该模块
b.不再继续执行
2、如果Y是以“./”、“/”或“../”开头
a.把X当成文件,从指定路径开始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一个存在,就返回该文件,不再继续执行
b.把X当成目录,从指定路径开始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一个存在,就返回该文件,不再继续执行
3.如果 X 不是核心模块,也没有以“./”、“/”或“../”开头,则Nodejs会从当前模块的父目录开始,尝试从它的 /node_module 目录里加载模块,如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录
4.抛出“not found”
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文主要介绍了react hooks组件间的传值方式(使用ts),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章我们来了解Nodejs中的文件流,有很多新手对用户Nodejs中的文件流不是很理解的,对此下文给大家来详细的介绍一下,感兴趣的朋友不妨了解看看,对大家会有一定的帮助,那么接下来就跟随小编来一起学习一下吧!
这篇文章给大家分享的是JS改变元素宽高的方法。这里使用到的是setAttribute() ,能用于添加指定的属性,并为其赋指定的值,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢?下面本篇文章就来一起了解一下,希望对大家有所帮助!
判断方法:1、使用“document.getElementById("id值")”语句根据指定id值获取div元素对象;2、利用if语句判断div是否存在,语法“if (div元素对象){//元素存在}else{//元素不存在}”。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008