升级到玩 2.2 后,我无法让 requirejs 像以前一样工作。
在我看来,requirejs 没有正确初始化或配置。我试图关注https://github.com/mariussoutier/play-angular-require-seed,但我什至无法让最简单的情况起作用。
jquery 可以在 main.js 中正确定位,但是 require(['jquery'].....) 在标签中不起作用。
如果有人可以帮助我,将不胜感激。
webjars 定义
libraryDependencies ++= Seq(
javaJdbc,
javaEbean,
cache,
"org.webjars" % "jquery" % "1.10.2",
"org.webjars" % "requirejs" % "2.1.1",
"org.webjars" % "webjars-play_2.10" % "2.2.0"
)
resolvers += "typesafe" at "http://repo.typesafe.com/typesafe/repo"
requireJs += "main.js"
requireJsShim += "main.js"
main.js
(function(requirejs) {
"use strict";
// -- PROD RequireJS config --
requirejs.config({
shim: {
"jquery": { exports: "$" }
},
paths: {
"jquery": ["/webjars/jquery/1.10.2/jquery.min"]
}
});
// It works fine here
require(["jquery"], function($) {
console.log($);
});
})(requirejs);
index.scala.html
@(title: String)
<html>
<body>
<script src='/lib/require.js' type='text/javascript' data-main="/assets/javascripts/main"></script>
<script type="text/javascript">
require(["jquery"], function($) {
console.log($);
});
</script>
</body>
</html>
main.js 加载完毕,控制台报错信息为
Uncaught TypeError: Property 'require' of object [object Object] is not a function
编辑 这里的关键是理解 AMD 的概念。尽管标签中的两个片段一个接一个地放置,但不能保证它们按顺序执行。因此,当第二个片段运行时,可能还没有配置 requirejs。
<script src='webjars/requirejs/2.1.8/require.js' type='text/javascript' data-main="javascripts/main"></script>
<script type='text/javascript'>
// Second snippet
require(['jquery'], function($) {return $;});
</script>
为了解决这个问题,我们有两种不同的方法:
- 在 main.js 中包含第二个片段的 javascript 代码(在 data-main 中指定)并使用 require(['dependencies'], function() {// do second.js})
- 包含 requirejs 时不要指定 data-main 字段,并在第二部分进行所有配置。
恕我直言,第一种方法是首选方法,并且与示例项目中使用的确切方法https://github.com/mariussoutier/play-angular-require-seed