无法使用“要求”加载模块

时间:2019-10-08 21:36:29

标签: javascript netbeans

我无法成功使用“ 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中运行都没有运气。我觉得如果我能解决这个问题,从现在开始航行将会很顺利!谢谢!

2 个答案:

答案 0 :(得分:0)

感觉您的问题(或您的代码)缺少一些行,我想这会起作用:

// 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));

所缺少的步骤实际上是“要求”模块并将结果绑定到可以用来调用函数的变量!

答案 1 :(得分:0)

浏览器代码开始:

(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.weekdaywindow.weekday所取代-编写this.weekday={}以将weekday用作全局变量名称很容易混淆。

该代码的作用是硬代码,该匿名函数的主体的参数名称为exports,,并使用新创建的window.weekday对象对其进行调用。调用weekday之后,exports参数的值已用新方法更新。

提供了匿名函数代码来模拟require的工作方式。


服务器代码

现在考虑通过创建一个require函数来推广匿名函数模型

  • 为您创建并返回一个新的exports对象,
  • 采用包含正文代码的文件的文件路径来修改exports
  • 在形式参数名称为“ exports”下以exports作为实际参数的函数中执行主体代码。

然后您可以将其命名为

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的简单实现-节点的require方法具有其他功能,例如以exports对象作为其{{1}对象调用主体代码}值。
  • 帖子中this函数声明之后显示的两行

    require

    不合适,应该将其删除。

  • 在这些示例中,console.log(weekDay.name(1)); output: "weekDay.name is not a function" 是用于保存weekDay返回的导出对象的变量名,对于匿名函数,则是用作变量的窗口属性名。