手动要求模块与使用browserify动态调用它们有何不同?

时间:2014-08-01 11:27:35

标签: javascript node.js angularjs

很抱歉尴尬的帖子标题,但这是一个非常奇怪的情况。在我的项目中,我有一个像这样的文件夹结构:

/filters
     index.js
     [...]
/controllers
     index.js
     [...]
app.js

app.js基本上是我的应用程序的入口点,我认为如果我可以通过require()目录自动加载这些目录的内容并且index.js为{每个目录都负责加载需要加载的任何内容。

但是我遇到了一个我不明白的问题。因为我故意是钝的(这是一次学习/实验练习),所以我决定尽可能地将它保持为DRY,所以我尝试了这么大的代码来处理模块加载:

'use strict';

var customModules = [
    'controllers',
    'filters'
];

//require('./controllers');
//require('./filters');

for (var i in customModules) {
    if (customModules.hasOwnProperty(i)) {
        require('./' + customModules[i]);
    }
}

var nativeModules = [
    'ngSanitize'
];

angular.module('app', customModules.concat(nativeModules));

我计划将其提取到自己的模块中,但它会进行演示。由于某种原因,此代码抛出此异常:

Uncaught Error: Cannot find module './controllers'

但是当我使用静态字符串

加载它时
require('./controllers');

没有问题,一切正常,我的示例应用程序按预期运行。

1 个答案:

答案 0 :(得分:1)

结帐Browserify Handbook how browserify works(强调我的):

  

Browserify从您提供的入口点文件开始,并使用源代码的抽象语法树的静态分析搜索它找到的任何require()调用。

     

对于每次使用一个字符串的require()调用,browserify会将这些模块字符串解析为文件路径,然后递归搜索这些文件路径以寻找require()调用,直到访问整个依赖关系图。

底线:必须静态声明依赖项;涉及动态创建的require()调用的代码无法正常工作(原则上这是一个好主意)。

您可以使用服务器端或构建时技术获得类似的结果。