Node.js module.exports的用途是什么?您如何使用它?
我似乎找不到关于这个的任何信息,但它似乎是Node.js的一个相当重要的部分,因为我经常在源代码中看到它。
根据Node.js文档:
单元参考电流单元特别是module.exports与导出对象相同。看见src/node.js获取更多信息。
但这并没有真正的帮助。
module.exports到底做什么?一个简单的例子是什么?
Node.js module.exports的用途是什么?您如何使用它?
我似乎找不到关于这个的任何信息,但它似乎是Node.js的一个相当重要的部分,因为我经常在源代码中看到它。
根据Node.js文档:
单元参考电流单元特别是module.exports与导出对象相同。看见src/node.js获取更多信息。
但这并没有真正的帮助。
module.exports到底做什么?一个简单的例子是什么?
当前回答
模块系统的目的是什么?
它完成了以下任务:
使我们的文件从膨胀到真正的大尺寸。在开发过程中,通常很难处理包含5000行代码的文件。强制分离关注点。将代码拆分为多个文件可以让我们为每个文件指定适当的文件名。通过这种方式,我们可以很容易地确定每个模块都做什么以及在哪里找到它(假设我们制作了一个逻辑目录结构,这仍然是您的责任)。
拥有模块可以更容易地找到代码的某些部分,从而使代码更易于维护。
它是如何工作的?
NodejS使用CommomJS模块系统,其工作方式如下:
如果文件想要导出某些内容,则必须使用module.export语法声明它如果文件要导入某个内容,则必须使用require('file')语法声明它
例子:
测试1.js
const test2 = require('./test2'); // returns the module.exports object of a file
test2.Func1(); // logs func1
test2.Func2(); // logs func2
测试2.js
module.exports.Func1 = () => {console.log('func1')};
exports.Func2 = () => {console.log('func2')};
其他需要了解的有用信息:
正在缓存模块。当您在两个不同的文件中加载相同的模块时,该模块只需加载一次。第二次对同一模块调用require()时,将从缓存中取出。模块以同步方式加载。这个行为是必需的,如果它是异步的,我们无法立即访问从require()中检索的对象。
其他回答
参考链接如下:
exports = module.exports = function(){
//....
}
导出或模块的财产。导出,例如函数或变量,将在外部公开
有一点你必须更加注意:不要覆盖导出。
为什么?
因为导出只是module.exports的引用,所以可以将财产添加到导出中,但如果覆盖导出,引用链接将断开。
很好的例子:
exports.name = 'william';
exports.getName = function(){
console.log(this.name);
}
坏例子:
exports = 'william';
exports = function(){
//...
}
如果您只想公开一个函数或变量,如下所示:
// test.js
var name = 'william';
module.exports = function(){
console.log(name);
}
// index.js
var test = require('./test');
test();
这个模块只公开了一个函数,name的属性对外是私有的。
ECMAScript模块-2022
从Node 14.0开始,ECMAScript模块不再是实验性的,您可以使用它们代替经典Node的CommonJS模块。
ECMAScript模块是打包JavaScript代码以供重用的官方标准格式。模块是使用各种导入和导出语句定义的。
您可以定义导出函数的ES模块:
// my-fun.mjs
function myFun(num) {
// do something
}
export { myFun };
然后,您可以从my-fun.mjs导入导出的函数:
// app.mjs
import { myFun } from './my-fun.mjs';
myFun();
.mjs是Node.js ECMAScript模块的默认扩展名。但是,在使用package.json“type”字段或CLI中的--input-type标志解析模块时,可以将默认模块扩展配置为查找。
Node.js的最新版本完全支持ECMAScript和CommonJS模块。此外,它还提供了它们之间的互操作性。
模块导出
ECMAScript和CommonJS模块有很多不同之处,但与此问题最相关的区别是,不再需要,不再导出,不再模块。导出
在大多数情况下,ES模块导入可用于加载CommonJS模块。如果需要,可以使用module.createRequire()在ES模块中构造require函数。
ECMAScript模块发布历史记录
Release | Changes |
---|---|
v15.3.0, v14.17.0, v12.22.0 | Stabilized modules implementation |
v14.13.0, v12.20.0 | Support for detection of CommonJS named exports |
v14.0.0, v13.14.0, v12.20.0 | Remove experimental modules warning |
v13.2.0, v12.17.0 | Loading ECMAScript modules no longer requires a command-line flag |
v12.0.0 | Add support for ES modules using .js file extension via package.json "type" field |
v8.5.0 | Added initial ES modules implementation |
您可以在Node.js存储库中找到所有变更日志
将程序代码划分为多个文件时,module.exports用于向模块的使用者发布变量和函数。源文件中的require()调用将替换为从模块加载的相应module.exports。
编写模块时记住
模块加载被缓存,只有初始调用评估JavaScript。可以在模块中使用局部变量和函数,而不需要导出所有内容。module.exports对象也可用作导出速记。但当返回一个单独的函数时,请始终使用module.exports。
根据:“模块第2部分-编写模块”。
这已经得到了回答,但我想补充一些澄清。。。
您可以使用exports和module.exports将代码导入应用程序,如下所示:
var mycode=require('./path/to/mycode');
您将看到的基本用例(例如在ExpressJS示例代码中)是在.js文件中的exports对象上设置财产,然后使用require()导入该文件
因此,在一个简单的计数示例中,您可以:
(counter.js):
var count = 1;
exports.increment = function() {
count++;
};
exports.getCount = function() {
return count;
};
…然后在您的应用程序(web.js或任何其他.js文件)中:
var counting = require('./counter.js');
console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2
简单地说,您可以将所需文件视为返回单个对象的函数,并且可以通过在导出时设置它们,将财产(字符串、数字、数组、函数等)添加到返回的对象中。
有时您会希望require()调用返回的对象是可以调用的函数,而不仅仅是具有财产的对象。在这种情况下,还需要设置module.exports,如下所示:
(sayhello.js):
module.exports = exports = function() {
console.log("Hello World!");
};
(app.js):
var sayHello = require('./sayhello.js');
sayHello(); // "Hello World!"
这里的答案更好地解释了exports和module.exports之间的区别。
下载和安装node.js时,node.js中有一些默认或现有的模块,如http、sys等。
由于它们已经在node.js中,所以当我们想要使用这些模块时,我们基本上喜欢导入模块,但为什么呢?因为它们已经存在于node.js中。导入就像从node.js获取它们并将它们放入程序中。然后使用它们。
而Exports正好相反,您正在创建所需的模块,比如模块addition.js,并将该模块放入node.js,您可以通过导出它来实现。
在这里写任何东西之前,请记住,module.exports.additionTwo与exports.additionTwo相同
嗯,这就是原因,我们确实喜欢
exports.additionTwo = function(x)
{return x+2;};
小心道路
假设您创建了addition.js模块,
exports.additionTwo = function(x){
return x + 2;
};
在NODE.JS命令提示符下运行此命令时:
node
var run = require('addition.js');
这将导致错误
错误:找不到模块addition.js
这是因为node.js进程无法执行addition.js,因为我们没有提到路径。因此,我们可以使用NODE_path设置路径
set NODE_PATH = path/to/your/additon.js
现在,这应该可以成功运行,没有任何错误!!
还有一件事,您也可以通过不设置NODE_PATH来运行addition.js文件,返回nodejs命令提示符:
node
var run = require('./addition.js');
因为我们在这里提供的路径是在当前目录中。/这也应该成功运行。