$injector:modulerr 在 r.js 优化之后,但不是之前



我正在使用带有r.jsrequire.js进行优化。 预优化,我有:

// MainCtrl.js
define(function () {
    return ["$scope", function ($scope) { console.log($scope); }];
});
// main.js
require.config({                                                                
    shim: {                                                                     
        angular: {                                                              
            exports: "angular",                                                 
        },                                                                      
    },                                                                          
    paths: {                                                                    
        angular: "lib/angular.min",                                             
    },                                                                          
});
require(["angular", "MainCtrl"], function (ng, MainCtrl) {
    console.log(ng);
    var app = ng.module("myapp", []);
    app.controller("MainCtrl", MainCtrl);
});

我的HTML非常简单;它只是在<html>ng-app=myapp,在<body>ng-controller=MainCtrl

当我像这样运行应用程序时,一切似乎都正常。 我得到了ngconsole.log,这似乎是angular对象。 然后,我从MainCtrl那里得到了$scope console.log。 没问题。

运行r.js并使用缩小的main.js后,我收到错误并且事情不再起作用。 我跑r.js -o build.js.

// build.js
({                                                                              
    appDir: "public",                                                           
    baseUrl: "js",                                                              
    dir: "dist",                                                                
    fileExlusionRegExp: /^(r|build.js)$/,                                      
    optimize: "uglify2",                                                        
    optimizeCss: "standard",                                                    
    modules: [{                                                                 
        name: "main"                                                            
    }],                                                                         
    paths: {                                                                    
        angular: "lib/angular.min",                                             
    },                                                                          
})

现在,当我访问index.html时,我收到错误:

未捕获的错误: [$injector:模块] 定义 未捕获的类型错误:无法调用未定义的方法"模块"

  1. 似乎表明角度未正确加载或其他内容。 它不能注入一些东西来myapp,但它没有依赖关系。 不是ngRoute或任何东西
  2. ng现在未定义,即使它之前已正确angular。 这也会导致第二个错误
  3. 不调用 MainCtrl 中的console.log。 这并不奇怪,因为上一行有错误。 但是,如果我将ng更改为angular则不会发生undefined错误,并且app.controller被调用,但仍然没有调用来自MainCtrlconsole.log

我唯一的猜测是角度被缩小了两次(我已经在使用angular.min.js然后r.js再次缩小它)。 我可以做些什么来解决这个问题吗?

shim文档中,建议:

您应该使用 mainConfigFile 构建选项来指定在其中查找填充程序配置的文件。否则,优化程序将不知道填充程序配置。另一个选项是在构建配置文件中复制填充程序配置。

这可能导致angular的填充程序在构建文件中不存在。

最新更新