我正在尝试使用传递给函数的变量使用browserify require
文件:
var playersOptions = {
name: 'players',
ajax: 'team-overview',
route: {
name: 'overview',
path: 'playersOverview',
url: 'playersoverview'
}
};
var BackboneView = require(playersOptions.route.path);
//Error: Uncaught Error: Cannot find module 'playersOverview'
var BackboneView = require('playersOverview');
//Requires the file without any problems.
我很困惑为什么会失败?当两者都是字符串时怎么能找不到模块?
答案 0 :(得分:18)
Browserify必须能够在构建时静态分析所有require语句,以便知道它需要包含在bundle中的文件。这要求require
只能与源代码中的字符串文字一起使用。
不要将模块的名称传递给稍后要求,只需传递模块本身:
var playersOptions = {
name: 'players',
ajax: 'team-overview',
route: {
name: 'overview',
module: require('playersOverview'),
url: 'playersoverview'
}
};
var BackboneView = playersOptions.route.module;
即使没有这个Browserify限制(例如,如果你直接使用node.js),最好还是避免以后要求传递模块名称,因为如果模块名称通过则require调用可能会中断它有一个相对于调用者目录的路径,并被传递到另一个目录中的文件中的代码。