7

我有一个使用 AngularJS 用 CoffeeScript 编写的项目。我的供应商依赖项是使用 Bower 安装的,我的文件结构是这样的:

- assets
 - js
  - app
   - model
    - *.coffee
   - factory
    - *.coffee
   ...
   - app.coffee
   - config.coffee
   - routes.cofeee
  - vendor
   - angular
   - lodash
   ...
  - dist

我想要做的是以下几点:

  1. 我正在尝试弄清楚如何使用 RequireJSr.js来优化我的应用程序文件,以便我基本上得到一个有序的串联文件(因此供应商依赖项、我的配置和路由,以及我的应用程序文件)。
  2. 将其集成到我的 Grunt 文件中。

我试过使用r.js优化器,但也许我太傻了,因为它似乎只是将我的应用程序文件(减去供应商依赖项)复制到 dist 文件夹中;但是,它确实设法优化了coffee生成的js文件。

有没有人有这方面的经验?

4

2 回答 2

11

我想通了:r.js通过阅读您mainConfigFile的配置和您在配置中命名的任何模块来工作,这里的重要注意事项是r.js只查看您命名模块中的第一个require/define并开始寻找它们;因此,例如,我有一个名为的模块app

require ['config'], (cfg) ->
  require ['angular'], (A) ->
    A.module cfg.ngApp, []

    require ['routes'], () ->
      require [
        'factory/a-factory',

        'service/a-service',

        'controller/a-controller'
      ], () ->
        A.bootstrap document, [cfg.ngApp]

这里的问题是r.js从未通过第一个require语句,因此连接不起作用。当我将其更改为(我的app.coffee)时:

require ['config'], (cfg) ->
  require ['angular'], (A) ->
    A.module cfg.ngApp, []

    require ['bootstrap'], (bootstrap) ->
      bootstrap()

我的bootstrap.coffee

define [
  'config',
  'angular',
  'routes',

  'factory/a-factory',

  'service/a-service',

  'controller/a-controller'
], (cfg, A, routes) ->
  class Bootstrap
    constructor: () ->
      routes()

      A.bootstrap document, [cfg.ngApp]

这意味着我只需要在我的配置中定义angular和,然后就可以完成其余的工作,如下所示:bootstrapr.jsincludesr.js

baseUrl: 'assets/js/app',
mainConfigFile: 'assets/js/app/config.js',
name: 'app',
include: [
  '../vendor/requirejs/require',
  'bootstrap'
],
out: 'assets/js/dist/app.js'

现在一切正常!~~很遗憾,我不得不告诉r.js包括在内requirejs,也许我在那里做了一些愚蠢的事情?~~

天哪,我真是个笨蛋!

因此,在我的 HTML 中,我将连接的脚本加载为:

<script src="assets/js/dist/app.js"></script>

当它真的应该像这样加载时:

<script src="assets/js/vendor/requirejs/require.js" data-main="assets/js/dist/app"></script>

哦!

于 2013-02-10T09:18:24.143 回答
1

来自 r.js 文档

https://github.com/jrburke/r.js/blob/master/build/example.build.js#L322

嵌套依赖可以捆绑在 requireJS > v1.0.3

//Finds require() dependencies inside a require() or define call. By default
//this value is false, because those resources should be considered dynamic/runtime
//calls. However, for some optimization scenarios, it is desirable to
//include them in the build.
//Introduced in 1.0.3. Previous versions incorrectly found the nested calls
//by default.
findNestedDependencies: false,
于 2014-01-23T00:42:30.250 回答