【发布时间】:2013-11-08 19:18:00
【问题描述】:
我正在使用 require.js 和 r.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 很简单;它只有ng-app=myapp 在<html> 和ng-controller=MainCtrl 在<body>。
当我像这样运行应用程序时,似乎一切正常。我得到console.log 的ng 似乎是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:modulerr] 不明确的 未捕获的类型错误:无法调用未定义的方法“模块”
- 似乎表明角度加载不正确或其他什么。它不能向
myapp注入一些东西,但它没有依赖关系。不是ngRoute或任何东西 -
ng现在未定义,即使它之前是正确的angular。这也会导致第二个错误 -
MainCtrl中的console.log未被调用。这并不奇怪,因为上一行有错误。 然而,如果我将ng更改为angular,则不会发生undefined错误并且会调用app.controller,但来自MainCtrl的console.log仍然是 em> 未调用。
我唯一的猜测是 angular 被缩小了两次(我已经在使用 angular.min.js 然后r.js 再次缩小它)。我可以做些什么来解决这个问题吗?
【问题讨论】:
-
尝试将
optimize设置为none以查看应用在最终构建中的放置顺序。这可能会给出提示。 -
@musically_ut 好的,我已经做到了。所有
angular.min.js首先出现,然后是define("angular",function(){})——这似乎是错误的。但是,如果我将require...angular.module块移动到文件的 top (在angular.min代码之前),一切正常!这对我来说没有意义,因为通常角度代码会先出现