我正在使用带有r.js
的require.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
。
当我像这样运行应用程序时,一切似乎都正常。 我得到了ng
的console.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:模块] 定义 未捕获的类型错误:无法调用未定义的方法"模块"
- 似乎表明角度未正确加载或其他内容。 它不能注入一些东西来
myapp
,但它没有依赖关系。 不是ngRoute
或任何东西 -
ng
现在未定义,即使它之前已正确angular
。 这也会导致第二个错误 - 不调用
MainCtrl
中的console.log
。 这并不奇怪,因为上一行有错误。 但是,如果我将ng
更改为angular
则不会发生undefined
错误,并且app.controller
被调用,但仍然没有调用来自MainCtrl
的console.log
。
我唯一的猜测是角度被缩小了两次(我已经在使用angular.min.js然后r.js
再次缩小它)。 我可以做些什么来解决这个问题吗?
在shim
文档中,建议:
您应该使用 mainConfigFile 构建选项来指定在其中查找填充程序配置的文件。否则,优化程序将不知道填充程序配置。另一个选项是在构建配置文件中复制填充程序配置。
这可能导致angular
的填充程序在构建文件中不存在。