使用RequireJS的模块未正确导出

时间:2017-04-14 10:28:51

标签: javascript node.js requirejs node-modules console.log

我目前正在开发一个本地JavaScript应用程序,它可以帮助我动态生成一些管理文档,例如特定客户的非付费服务的发票和凭证。

我将使用node_modules,到目前为止我使用(["jsonfile", "uniqid", "mkdirp"])这些模块需要存储在变量中。

问题是我在其文档

中调用了jsonfile

var jsonfile = require("jsonfile");

当来自javascript文件的console.log(jsonfile)时它返回function localRequire(),就像我在浏览器控制台中编写该命令一样...因为它将返回

>> console.log(jsonfile)
Object { spaces: null, readFile: readFile(), readFileSync: readFileSync(),     writeFile: writeFile(), writeFileSync: writeFileSync() } 
undefined

并且为了使问题更复杂,当从控制台或脚本调用readFile()时,它返回readFile()不是定义的函数而是jsonfile或fs这是一个节点jsonfile

所需的模块
>>function readFile()
jsonfile.readFile()
TypeError: fs.readFile is not a function

我真的不知道有什么区别以及如何从控制台使用该变量而不是脚本变量。特别是我在运行应用程序后没有在控制台中重新定义它。

您可能需要的一些代码段:

我在index.html中调用了两个脚本:

<!--requirejs -->
<script data-main="app" src="node_modules/requirejs/require.js"></script>
<!-- a script which will use $ which is not defined -->
<script src="services/specifyDocType.js"></script>
<!--the script the call require and have the jsonfile variable -->
<script src="jsonfile-test.js"></script>

app.js代码:

requirejs.config({
  //"baseUrl": "node_modules",
  "paths": {
    "app": "app",
    "jsonfile": "jsonfile/index",
    "graceful-fs": "jsonfile/node_modules/graceful-fs/graceful-fs",
    "fs": "/node_modules/jsonfile/node_modules/graceful-fs/fs",
    "jquery": "node_modules/jquery/dist/jquery.min"
    }
});

requirejs(["dist/js/main"]);

main.js

define("jquery", function($) {
  $('body');
});

对于将创建jsonfile变量的本地脚本,这是我必须进行工作测试的初始代码:

var data = 'DOCS/voucher/voucher.json';
var jsonfile = require(["node_modules/jsonfile/index"]);

console.log(jsonfile);
//this console that returns the function localRequire() mentioned above.

jsonfile.readFile(data, function(err, obj) {
    console.dir(obj);
});

对于这个应用程序,我不需要使用像Angularjs这样的框架,我需要对目前使用的每个模块使用require来在根目录中创建唯一的id和目录。

还有一件事,这是我第一次运行时的控制台:

function localRequire()  jsonfile-test.js:4:1
TypeError: jsonfile.readFile is not a function[Learn More]  jsonfile-test.js:6:1
ReferenceError: module is not defined[Learn More]  index.js:133:1
Error: Module name "fs" has not been loaded yet for context: _. Use require([]) http://requirejs.org/docs/errors.html#notloaded  require.js:168:17
Use of getPreventDefault() is deprecated.  Use defaultPrevented instead.

1 个答案:

答案 0 :(得分:1)

您似乎认为RequireJS是Node require电话的直接替代品。事实并非如此。

Node支持CommonJS模块系统。 RequireJS支持异步模块定义(AMD)系统。 (有关两者之间差异的问题,请参阅here。)它还支持促进使用CommonJS模块,但支持使用CommonJS模块原样。至少,CommonJS模块必须包含在define调用中。如果您从这个CommonJS模块开始,例如:

function foo() {}

exports.foo = foo;

然后您至少需要将其转换为:

define(function (require, exports) {
  function foo() {}

  exports.foo = foo;
});

此外,虽然RequireJS可以使用CommonJS模块,但它无法为依赖于节点VM的模块提供支持。 fs就是这样一个模块。这取决于Node VM。它无法在浏览器中运行。 DOM不公开fs模块可用于访问文件系统的API。 jsonfile取决于fs,因此您无法在浏览器中使用RequireJS加载它。您可能可能找到一个模块,该模块在提供与fs兼容的API的浏览器中运行,并向客户端代码提供虚假文件系统,这可能有效,但您必须完成工作找到替换模块。 RequireJS不会为你做这件事。