在browserify中要求不起作用变量名

时间:2014-10-17 22:21:49

标签: javascript browserify

我正在尝试使用传递给函数的变量使用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.

我很困惑为什么会失败?当两者都是字符串时怎么能找不到模块?

1 个答案:

答案 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调用可能会中断它有一个相对于调用者目录的路径,并被传递到另一个目录中的文件中的代码。