Coffeescript 用Grunt连接并缩小需求

Coffeescript 用Grunt连接并缩小需求,coffeescript,requirejs,gruntjs,Coffeescript,Requirejs,Gruntjs,我有一个用CoffeeScript编写的项目,它使用AngularJS。我的供应商依赖项是使用Bower安装的,我的文件结构如下: - assets - js - app - model - *.coffee - factory - *.coffee ... - app.coffee - config.coffee - routes.cofeee - vendor - angular - lodash ... -

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

- assets
 - js
  - app
   - model
    - *.coffee
   - factory
    - *.coffee
   ...
   - app.coffee
   - config.coffee
   - routes.cofeee
  - vendor
   - angular
   - lodash
   ...
  - dist
<script src="assets/js/vendor/requirejs/require.js" data-main="assets/js/dist/app"></script>
我想做的是:

  • 我正在努力研究如何使用RequireJS的
    r.js
    优化我的应用程序文件,这样我就可以得到一个完全有序的连接文件(因此供应商依赖性、配置和路由,以及我的应用程序文件)
  • 将其集成到我的Grunt文件中
  • 我尝试过使用
    r.js
    Optimizer,但可能我太傻了,因为它似乎只是将我的应用程序文件(减去供应商依赖项)复制到dist文件夹中;但是,它确实能够优化
    coffee
    生成的
    js
    文件


    有人对此有经验吗?

    我想:
    r.js
    通过阅读您的
    maincigfile
    和您在配置中命名的任何模块来工作,这里需要注意的是,
    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()
    
    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]
    
    这意味着我只需要在我的
    r.js
    配置中将
    angular
    bootstrap
    定义为
    includes
    ,然后
    r.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>
    
    
    
    实际上,它应该像这样加载:

    - assets
     - js
      - app
       - model
        - *.coffee
       - factory
        - *.coffee
       ...
       - app.coffee
       - config.coffee
       - routes.cofeee
      - vendor
       - angular
       - lodash
       ...
      - dist
    
    <script src="assets/js/vendor/requirejs/require.js" data-main="assets/js/dist/app"></script>
    
    
    

    来自r.js文档

    嵌套依赖项可以捆绑在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,
    

    您是否将
    require.js
    r.js
    结合使用?感谢您不仅返回,为您自己的问题提供了答案,而且还提供了一个非常好的答案。