Node.js - 在运行时加载文件

use*_*891 1 javascript runtime require node.js

我是Node.js的新手,在运行时很难理解加载库或文件的方法.显然,使用Node.js的本机"require"函数在运行时加载文件是一个坏主意,因为它阻塞了i/o,因此不应在请求处理程序中使用.所以,我假设要避免这样的事情:

var http = require('http').createServer(function(req, res) { 
  var file = require('./pages/'+req.url);
  res.end();
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

那么有没有办法以非阻塞/异步方式在运行时需要文件?

我不认为总是可以在"启动时"而不是运行时加载文件,因为在上面的例子中,知道要加载/需要什么文件的唯一方法是通过req.url属性获取名称.

所以这似乎是唯一的选择.除非,文件夹中的所有文件都是预先加载的,然后按名称调用,在回调中(通过使用fs.readdirSync或者某些东西来遍历文件夹中的所有文件并将获得的文件的名称与req.url属性进行比较),但这似乎很浪费."预加载"文件夹中的所有文件(可能大约50个文件),然后只使用其中的1个,这似乎不是一个好主意.我错了吗?

无论哪种方式,我只想知道是否有一种方法可以在运行时以更好,非阻塞/异步的方式要求文件.

谢谢!

hex*_*ide 6

该函数require()通常用于在大多数应用程序运行之前缓存模块或配置文件.您可以考虑使用require()这样的方式:

var file = fs.readFileSync('/path');

// depending on the file type
eval(file);
JSON.parse(file);
Run Code Online (Sandbox Code Playgroud)

这样做的原因是依赖性按顺序加载.如果要在初始化应用程序后读取文件,则应使用异步读取,并在回调中进行响应,如下所示:

var http = require('http');
http.createServer(function(req, res) {
  fs.readFile('./pages/' + req.url, function(err, data) {
    res.end(data);
  });
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

如果您需要检查文件是否存在,那么您可以使用fs.stat()检查文件的存在,而不是查询目录.

var http = require('http');
http.createServer(function(req, res) {
  var file = './pages/' + req.url;
  fs.stat(file, (err, stats) {
    if (err || !stats.isFile()) {
      res.writeHead(404);
      res.send();

      return;
    }

    fs.readFile(file, function(err, data) {
      res.writeHead(200);
      res.end(data);
    });
  });
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

  • 如果这就是您要寻找的,那实际上是不可能的。曾经有一个异步的`require()`,但很少使用并最终被删除。但是,您可以派生主进程并在另一个进程中运行代码。还有一些模块可以执行与eval()类似的功能,例如vm模块,vm.runInNewContext()和vm.runInThisContext()。 (2认同)