无法使用"require"加载模块



我无法成功使用"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 对象的变量名称,或者在匿名函数的情况下,是用作变量的窗口属性名称。

最新更新