如何在Play Framework 2.1.1 Java中使用多个main.js文件来进行RequireJs?

5
我正在使用AngularJs + RequireJs在Play Framework 2.1.1中构建单页应用程序。我有两个应用程序位于同一Play服务器内,管理面板和普通网站。这就是为什么我有两个主要的.js文件分别为Admin Dashboard和Normal website。应用程序结构如下所示。我从public/javascripts中获取了这些信息。
我们想要分离这两个页面,所以我们有两个main.js文件。然而,我现在面临的问题是,在根main.js中一切都很好。如果我进入我的应用程序http://localhost:9000/,一切都很正常,如果我查看Firebug上的网络面板,我只看到require.js和main.js,这正是我期望的。然而,当我进入管理面板http://localhost:9000/admin时,每个文件都被正确地缩小了。但是当我查看网络时,我看到所有的JavaScript文件,它本不应该是这样的。我认为每个脚本都应该是从requireJs动态加载的。这意味着浏览器会多次调用以获取所有必要的文件,而不仅仅是获取require.js和main.js来解决依赖关系。我做错了什么吗?

我从这个项目中得到了结构https://github.com/maxdow/angularjs-requirejs-seed

├── admin
│   ├── app.js
│   ├── bootstrap.js
│   ├── controllers
│   │   ├── AdminAppController.js
│   │   └── index.js
│   ├── directives
│   │   ├── Directive.js
│   │   └── index.js
│   ├── filters
│   │   └── index.js
│   ├── impl.js
│   ├── main.js
│   └── routes.js
├── app.js
├── bootstrap.js
├── controllers
│   ├── Controller.js
│   └── index.js
├── directives
│   ├── Directive.js
│   └── index.js
├── filters
│   └── index.js
├── impl.js
├── lib
│   └── angular
│       ├── angular-cookies.min.js
│       ├── angular-flash.min.js
│       ├── angular-resource.min.js
│       └── angular.min.js
├── main.js
├── routes.js
└── services
    ├── Service.js
    └── index.js

你会注意到在admin/文件夹中有一个main.js,在根目录中也有另一个main.js。
代码看起来就像这样。
require.config({

    paths: {
        'angular': './lib/angular/angular.min',
        'angular-resource': './lib/angular/angular-resource.min',
        'angular-cookies': './lib/angular/angular-cookies.min'
    },

    /**
     * for libs that either do not support AMD out of the box, or
     * require some fine tuning to dependency mgt'
     */
    shim: {
        'angular': {
            exports: 'angular',
            deps: []
        },
        'angular-resource': {
            deps: ['angular']
        },
        'angular-cookies': {
            deps: ['angular']
        }
    }
});

require(['./bootstrap'], function () {
    //nothing to do here...see bootstrap.js
});

这是我的常规网站模板的外观。
@helper.requireJs(core = routes.Assets.at("javascripts/require.js").url, module = routes.Assets.at("javascripts/main").url)

这是我的管理页面模板的外观。
@helper.requireJs(core = routes.Assets.at("javascripts/require.js").url,
                            module = routes.Assets.at("javascripts/admin/main").url)

这是我的 Build.scala 文件

  val main = play.Project(appName, appVersion, appDependencies).settings(
    requireJs += "main.js",
    requireJsShim += "main.js"

  )

这是我执行play start时构建的样子。
[info] Loading project definition from /Users/myuser/MyProject/project/main/project
[info] Set current project to project (in build file:/Users/myuser/MyProject/project/main/)
[info] RequireJS optimization has begun...
[info] app.build.js:
[info] ({appDir: "javascripts",
[info]           baseUrl: ".",
[info]           dir:"javascripts-min", mainConfigFile: "javascripts/main.js", modules: [{name: "main"}]})

Tracing dependencies for: main
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/app.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/bootstrap.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/controllers/AdminAppController.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/controllers/index.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/directives/Directive.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/directives/index.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/filters/index.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/impl.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/main.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/admin/routes.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/app.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/bootstrap.js
min/controllers/Controller.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/directives/index.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/directives/Directive.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/filters/index.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/impl.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/lib/angular/angular-cookies.min.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/lib/angular/angular-flash.min.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/lib/angular/angular-resource.min.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/lib/angular/angular.min.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/main.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/routes.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/services/Service.js
Uglifying file: /Users/myuser/MyProject/project/main/target/scala-2.10/classes/public/javascripts-min/services/index.js

main.js
----------------
lib/angular/angular.min.js
filters/index.js
lib/angular/angular-resource.min.js
lib/angular/angular-cookies.min.js
services/index.js
directives/index.js
controllers/index.js
app.js
routes.js
controllers/Controller.js
directives/Directive.js
services/Service.js
impl.js
bootstrap.js
main.js

我在Build.scala中进行了一些更改

requireJsShim += "main.js",
    requireJsShim += "admin/main.js",
    requireJs += "main.js",
    requireJs += "admin/main.js",

但我却收到了这个错误

({appDir: "javascripts",
[info]           baseUrl: ".",
[info]           dir:"javascripts-min", mainConfigFile: "javascripts/main.jsadmin/main.js", modules: [{name: "main"},{name: "admin/main"}]})
Error: /Users/user/MyProject/project/main/target/scala-2.10/classes/public/javascripts/main.jsadmin/main.js does not exist.

你可以看到它在requireJsShim中将两个字符串连接起来,我需要这样做才能让bootstrap与angularjs一起工作。
1个回答

6
在您的 build.scala 文件中,将所有动态 js 文件添加到 requireJS 中,例如:
val main = play.Project(appName, appVersion, appDependencies).settings(

    requireJsShim += "main-normal.js"
    requireJs += "main-normal.js",
    requireJs += "main-admin.js",

 )

当您使用“play start”开始播放时,requireJS将把这些单独的文件视为模块,在控制台输出中可以看到:

{
  appDir: "javascripts",
  baseUrl: ".",
  dir:"javascripts-min",
  mainConfigFile: "main-normal.js",
  modules: [
             {name: "main-normal"},
             {name: "main-admin"}
           ]
}

它将开始解决这些js文件的依赖关系,在您的网站上,使用firebug/chrome dev工具检查并在网络选项卡中反映这些更改,刷新或删除浏览器缓存以查看更改。

此外,为了提高性能,建议您使用r.js文件而不是play框架文档中建议的默认rhino编译器,您可以在这里下载: https://raw.github.com/jrburke/r.js/master/dist/r.js

将该文件复制到您的项目文件夹中,并在requireJsShim行上方的build.scala中添加以下行:

    requireNativePath := Some("r.js")

所以,实际上你的build.scala文件应该是:

val main = play.Project(appName, appVersion, appDependencies).settings(

    requireNativePath := Some("r.js"),
    requireJsShim += "main-normal.js"
    requireJs += "main-normal.js",
    requireJs += "main-admin.js",

 )

抱歉,我无法查看您的编辑后的问题。请提供原始文本以便我进行翻译。 - toy
@toy,如果你的main.js和admin/main.js都有相同的js文件在require配置路径中,那么只包含其中一个文件(即其中一个)在requireJsShim属性中就足够了,请尝试只添加其中一个到requireJsShim,它们已经被编译并且可以在另一个main.js模块中使用。 否则,如果这两个main.js文件具有不同的依赖关系,请尝试将所有这些依赖项添加到require.config.paths中的一个文件中,并仅将其包含在requireJsShim属性中,它们将被编译并可用于所有模块。 - somedev
另外,我忘了提到,如果您想要使用r.js文件,我认为您必须安装nodejs和requirejs,可以通过npm在node上安装requirejs,而r.js则存在于node_modules中。 - somedev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接