【问题标题】:Concatenating and minifying RequireJS with Grunt使用 Grunt 连接和缩小 RequireJS
【发布时间】:2013-01-25 08:33:12
【问题描述】:

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

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

我想要做的是:

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

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

有人有这方面的经验吗?

【问题讨论】:

  • 您是否将require.jsr.js 结合使用?

标签: coffeescript requirejs gruntjs


【解决方案1】:

我想通了: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]

这意味着我只需要在我的r.js 配置中将angularbootstrap 定义为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>

真正应该像这样加载:

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

天哪!

【讨论】:

  • 感谢您不仅回来为您自己的问题提供答案,而且非常出色。
【解决方案2】:

来自 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,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多