我无法成功使用"require"来加载模块。我的书没有提供足够的背景。
它声称这就是我在模块文件中需要的全部内容(文件名为"newJavaScript.js"(:
var days = ["monday", "tuesday", "wednesday", "thursday"];
exports.name = function(number) {
return days[number];
};
exports.number = function(name) {
return days.indexOf(name);
};
这是我在 netbeans 中作为单独文件拥有的 require 函数:
function require(InterFaceFile) {
var code = new Function("exports", readFile(InterFaceFile));
var exports = {};
code(exports);
return exports;
}
console.log(weekDay.name(1));
output: "weekDay.name is not a function"
这与本书前面描述的模块相同,它提到这更多是针对浏览器端的:
(function(exports) {
var days = ["monday", "tuesday", "wednesday", "thursday"];
exports.name = function(number) {
return days[number];
};
exports.day = function(name) {
return days.indexOf(name);
};
})(this.weekday = {});
console.log(weekday.name(1));
我知道"weekDay"在第一个文件中没有位置,所以我尝试在其位置使用文件名(newjavascript.js,带引号和不带引号(,并且还尝试将整个第一段代码包装在名为"weekDay"的函数中,我在浏览器和 netbeans 中尝试过没有运气。我觉得如果我能解决这个问题,从现在开始一帆风顺!谢谢!
感觉您的问题(或您的代码(缺少一些行,我想这会起作用:
// code for require here
const weekDay = require("/path/to/weekday.js"):
console.log(weekDay.name(1)):
这似乎是了解 NodeJS 风格要求如何工作的练习。 或者,如果您使用的是其他方法(模块模式(:
const weekDay = (function(exports) {
var days = ["monday", "tuesday", "wednesday", "thursday"];
exports.name = function(number) {
return days[number];
};
exports.day = function(name) {
return days.indexOf(name);
};
})({});
console.log(weekDay.name(1));
缺少的步骤实际上是"需要"模块并将结果绑定到可用于调用函数的变量!
从浏览器代码开始:
(function(exports) {
var days = ["monday", "tuesday", "wednesday", "thursday"];
exports.name = function(number) {
return days[number];
};
exports.day = function(name) {
return days.indexOf(name);
};
})(window.weekday = {});
console.log(weekday.name(1));
这在浏览器中运行,并在控制台上记录"星期二"。 为了清楚起见,this.weekday
被替换为window.weekday
- 编写this.weekday={}
以使用weekday
作为全局变量名称会令人困惑。
代码的作用是对参数名称为exports,
的匿名函数的主体进行硬编码,并使用新创建的window.weekday
对象调用它。调用weekday
之后,exports
参数的值已使用新方法更新。
提供匿名函数代码以模拟require
的工作方式。
服务器代码
现在考虑通过创建一个require
函数来泛化匿名函数模型
- 为您创建并返回一个新的
exports
对象, - 获取包含正文代码的文件的文件路径来修改
exports
, - 在函数中执行主体代码,该函数将
exports
作为实际参数,在正式参数名称"export"下。
然后,您可以将其称为
var weekday = require( filePath_of_script);
对脚本文件使用文件路径需要访问文件系统。由于无限制访问在浏览器中不可用,因此此示例模拟了书中提到的readFile
方法:
function readFile( filePath) { // dummied example
let fileContent =
`
var days = ["monday", "tuesday", "wednesday", "thursday"];
exports.name = function(number) {
return days[number];
};
exports.number = function(name) {
return days.indexOf(name);
};
`;
return fileContent;
}
function require(InterFaceFile) { // from netbeans
// create a new function with first parameter named "exports":
var code = new Function("exports", readFile(InterFaceFile));
var exports = {};
code(exports);
return exports;
}
// usage example
var weekdays = require("newjavascript.js"); // create and save exports
console.log( weekdays.name( 1));
注意
- 本书(或 netbeans(介绍了
require
的简单实现 - node 的require
方法具有其他功能,例如使用exports
对象作为其this
值调用主体代码。 帖子中
require
函数声明后显示的两行console.log(weekDay.name(1)); output: "weekDay.name is not a function"
不合适,应将其删除。
在这些示例中,
weekDay
是用于保存require
返回的 exports 对象的变量名称,或者在匿名函数的情况下,是用作变量的窗口属性名称。