Coffeescript 带垫片的require.js的丑化不';我不想用咖啡脚本来写剧本2

Coffeescript 带垫片的require.js的丑化不';我不想用咖啡脚本来写剧本2,coffeescript,playframework-2.0,requirejs,Coffeescript,Playframework 2.0,Requirejs,我从事Play2.1.2项目,使用Angular.js、CoffeeScript、require.js和bower组织前端。 对于bower,我在/app/assets/javascripts/main.coffee文件中使用了shim。 然后我使用play clean stage部署并运行target/start 问题是:在阶段阶段,Play不会丑化资源。 在Build.scala中: val main = play.Project(appName, appVersion, appDepend

我从事Play2.1.2项目,使用Angular.js、CoffeeScript、require.js和bower组织前端。 对于bower,我在
/app/assets/javascripts/main.coffee
文件中使用了shim。 然后我使用
play clean stage
部署并运行
target/start

问题是:在
阶段
阶段,Play不会丑化资源。 在
Build.scala
中:

val main = play.Project(appName, appVersion, appDependencies).settings(
  requireJs += "main",
  requireJsShim += "main.js"
)
然后在阶段中丑化css之后:

Tracing dependencies for: main
Error: Load timeout for modules: angular-bootstrap,angular
http://requirejs.org/docs/errors.html#timeout
In module tree:
    main
      jquery

Error: Load timeout for modules: angular-bootstrap,angular
http://requirejs.org/docs/errors.html#timeout
In module tree:
    main
      jquery

[info] RequireJS optimization finished.
所以没有什么是丑陋的。在
main.coffee中

require.config
  paths:
    jquery: "lib/jquery/jquery"
    angular: "lib/angular/angular"
    ...
  shim:
    angular: {deps: ["jquery"], exports: "angular"}
    ...

define [
  "angular-bootstrap"
  "angular"
  ...
], ->
  app = angular.module "app"
  ...
  app
它在客户端工作得很好,所有路径都正确等等。
requireJsShim+=“main.js”
看起来也很正确:require.js优化似乎是在编译资产之后进行的,因此
main.coffee
或只是
main
不起作用


你知道问题的根源是什么吗?以前有人遇到过吗?

我有一个使用垫片的应用程序,我刚才回答了一个与您非常相似的问题。简而言之,垫片会覆盖文件

最终解决我的问题的方法是创建自定义
shim.coffee
,其中包含部分
require.config

require.config
  paths:
    jquery: "lib/jquery/jquery"
    angular: "lib/angular/angular"
    ...
不带
垫片
零件

然后,我必须在
define
子句中显式定义填充依赖项,并使用
requirejshim+=“shim.js”
——与我用于客户端配置的文件不同


然后uglifying和require.js优化开始工作

我确实遇到了这个问题(几乎;我的项目中没有使用CoffeeScript),结果我认为解决这个问题更容易。重申这个问题:某些JavaScript资源,特别是那些在其垫片中没有
export
设置的资源,会产生上面所述的“模块加载超时”。更糟糕的是,问题似乎是暂时的

将RequireJS配置(例如,
路径
垫片
)与模块分离似乎有帮助,但编译仍然不可靠,这使得在开发模式下工作更加复杂

我发现将
waitSeconds:0
添加到配置对象有助于可靠的构建。我无法理解为什么在编译过程中访问本地资源甚至可能出现超时。有关详细信息,请参阅

下面是我的RequireJS模块的一个片段,位于
public/javascripts
(您的路径可能会有所不同)


main.coffee不是目标,而是main.js(编译后)。你的目标文件夹中没有main.js吗(在start命令下)?[info]({appDir:“javascripts”,[info]baseUrl:“.”,[info]dir:“javascripts min”,maincigfile:“javascripts/shim.js”,模块:[{name:“main”}})错误:/var/www/play scala backbone todo/target/scala-2.10/classes/public/javascripts/shim.js不存在。我克隆了您的示例,但在
播放阶段
找不到
shim.js
——它在最近的提交中被删除。因此require.js优化失败。它仅适用于
require.config
中的
路径,但不适用于
shim
——我必须明确说明shim-deps:(是的,我会厌倦像require js文档使用shim一样处理Play shim,即包括DEP和导出。这更像是一个require文件检查lol…以找出丑化所需的依赖文件。看起来很棒,Michael,谢谢分享。我今天就试试。嗯,它真的很有效(我所做的唯一更改是在build.scala中添加以main.js为目标的shim,这是由于coffeescript处理)。因此,现在我不需要支持shim.coffee,waitSeconds:0不会影响应用程序,因为所有依赖项都是本地的。谢谢!
require({
  /* Fixes an unexplained bug where module loads would timeout
   * at compilation. */
  waitSeconds: 0,

  paths: {
    'angular': '../vendor/angular/angular',
    'angular-animate': '../vendor/angular/angular-animate',
    /* ... */

    'jquery': '../vendor/jquery/jquery'
  },

  shim: {
    'angular': {
      deps: [ 'jquery' ],
      exports: 'angular'
    },

    'angular-animate': ['angular'],
    /* ... */

    'jquery': {
      exports: 'jQuery'
    }
  },

  optimize: 'uglify2',
  uglify2: {
    warnings: false,
    /* Mangling defeats Angular injection by function argument names. */
    mangle: false
  }
})

define(['jquery', 'angular'], function($, angular) {
  /* Angular bootstrap. */
})