关于javascript里require的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于javascript里require的问题相关的知识,希望对你有一定的参考价值。

各位看官,我在使用require的时候遇到了问题,报错为:Uncaught Error: Module name "fs" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded

希望各位能帮我解答一下困惑,谢谢。

var deps = [
"underscore",
"/viz.js"
];

require( deps, function(mvc, _)
drawGraph();
);

function drawGraph()
var g = "digraph G a1 -> b3; b2 -> a3; a3 -> a0; ";
var tt=Viz(g,"svg");

这是因为你的fs模块还没加载好。

异步加载模块的时候,尤其是你在使用require加载多个模块的时候,
要在前面模块加载完成后,调用回调函数,调用第2个模块,然后再回调,调用第3个模块。。。
这样就不会报错了。
参考技术A require(arg,function(obj))第一个参数是路径数组,然后在function中将这个js当参数引用进来,这样在function中就可以使用了追问

我现在路径数组没有问题,主要是如何将这个js当参数引进来啊?

追答

//第一个参数就是
require(['a'], function(a)
a

)

追问

我知道你的意思,相关的资料我也差了不少,我只是想问具体到我这里应该怎么写?
var deps = [
"underscore",
"/viz.js"
];

require( deps, function(mvc, _,viz) //这样么?
drawGraph();
);

追答

从第一个开始对应吧,你加个断点看一眼不就知道了
不过像underscore这种不是加在config中么

追问

加个断点看一眼什么?我真的不熟这方面,不太理解你是什么意思。

追答

。。。。那这样好了

在function中

alert("a0" + arguments[0]);

alert("a1" + arguments[1]);

alert("a2" + arguments[2]);

arguments是传进来的参数,你比较一下就可以了

eg:

function consoles(a, b) alert(arguments);
consoles('a', 'b');//value is ['a', 'b']

追问

输出的是arguments[1] 为 undefined……

这是怎么回事啊?我在Sources里面看到这个js已经加载进来了啊,为什么参数传进来是undefined呢?

本回答被提问者和网友采纳
参考技术B 首先无论require还是import,都不是webpack的发明,它们是已经存在于世的不同的模块化规范(目前都不能直接运行于浏览器)。 于是需要通过webpack在配合各种plugin、loader将其转义

JavaScript - 使用 require 读取 JSON 文件的结果与 fs.readFileSync 不同

【中文标题】JavaScript - 使用 require 读取 JSON 文件的结果与 fs.readFileSync 不同【英文标题】:JavaScript - reading JSON file with require gives different result than fs.readFileSync 【发布时间】:2019-11-01 19:26:00 【问题描述】:

我遇到了一个问题,让我觉得我缺少关于 require 在 JavaScript 中的工作方式的一些东西。基本上,如果我使用 require 读取 JSON 文件,我得到的结果与使用 fs.readFileSync 不同。

我从一个包含以下内容的 JSON 文件开始:

"text":"old text"

我首先使用requirefs.readFileSync 读取文件,并得到相同的结果。然后我用fs.writeFileSync 更新文件并用requirefs.readFileSync 再次读取文件,但更新后我得到不同的结果。

请务必注意,我需要来自函数内部的文件。我希望这会在每个函数调用中单独导入文件,但这显然不是正在发生的事情。只是想知道是否有人可以准确地解释发生了什么。

const fs = require('fs');
const textPath = './test.json';

const oldTextJSON = getText();  // prints as "old text"
const oldTextRead = JSON.parse(fs.readFileSync(textPath)).text;  // prints as "old text"

fs.writeFileSync(textPath, JSON.stringify(
  text: "new text"
));

const newTextJson = getText();  // prints as "old text"
const newTextRead = JSON.parse(fs.readFileSync(textPath)).text;  // prints as "new text"

function getText() 
  return require(textPath).text;

【问题讨论】:

需要缓存结果。多次调用 require 不会重新读取文件。 @MarkMeyer 是对的,只是我更喜欢以不同的方式思考它。 Require 不读取文件,它导入节点模块。以及如何导入节点模块?一次加载到内存,然后注入到所有地方。 好的,我想这在多个文件需要一个文件时更明显 - 在所需文件的顶部添加 console.log 不会导致多次记录同一件事。但是,在大多数情况下,要么 1) require 用于另一个文件的顶部,它更明显地保存在内存中,要么 2) require 语句的结果不会改变。无论哪种方式,这都是有道理的。谢谢。 【参考方案1】:

希望这一行能说明require的特点。

const path = require("path");


const filepath = path.resolve(textPath);
delete require.cache[filepath];

无论您调用多少次,基本上都需要从 缓存 中读取。

【讨论】:

所以delete require.cache[filepath] 在这里什么都不做?在函数中 require(textPath).text 之前添加时,它似乎没有任何改变。 它会删除需要的缓存。然后如果你再次需要,它需要新的文件内容

以上是关于关于javascript里require的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于javascript异步

关于PHP函数

JavaScript - 使用 require 读取 JSON 文件的结果与 fs.readFileSync 不同

关于JavaScript的~怎样在文本框输入字的事件里激活按钮事件?

关于jquery validate 的问题

关于 require 动态地址引用的问题