【问题标题】:RequireJS Optimizer from mainConfigFile not working来自 mainConfigFile 的 RequireJS 优化器不起作用
【发布时间】:2014-04-20 05:56:10
【问题描述】:

我正在使用grunt-requirejs,我的应用结构如下所示:

site/
  dev/
    index.html
    config.coffee
    app.coffee
    etc.
  srv_dev/
    index.html
    config.js
    app.js
    etc.
  dist/
  node_modules/
  Gruntfile.coffee

当我运行grunt dev 时,文件会在其他任务中从咖啡编译为 js,并从 dev/ 复制到 srv_dev/,然后从那里提供服务。

我的 grunt dist 任务执行 dev 的操作,然后运行 ​​requirejs 任务,我希望它应该编译/组合我的应用程序的所有主要依赖项,但仍然允许 require(somevar)define 调用稍后运行。基本上,我的单​​页应用程序的某些部分在用户单击指向它的链接之前不会加载,这会触发 requrire()define() 调用。

我目前的问题似乎很基本......我已经将我的 requirejs grunt 任务设置如下:

requirejs:
  options:
    baseUrl: './'
    mainConfigFile: 'srv_dev/config.js'
  dist:
    options:
      out: 'dist/script.js'

这会抛出Error: Error: Missing either a "name", "include" or "modules" option

我已经阅读了大部分优化器文档以及example build file,但不明白这个错误是怎么回事。 this project 中的 tkellen 使用 almond.js 的 name 选项——但我不认为我想这样做,因为我需要那些懒惰的加载器 require() 调用。示例构建文件指出:“仅指定模块名称意味着模块将被转换为包含其所有依赖项的构建文件。”所以这是我的下一次尝试:

requirejs:
  options:
    baseUrl: './'
    name: 'srv_dev/config.js'
  dist:
    options:
      out: 'dist/script.js'

有了这个我得到Error: ENOENT, no such file or directory >> '/Users/user/Desktop/project/site/app.js'

所以它找到了 config.js,但是找不到配置中列出的路径,因为它使用了 require.js 配置的 baseUrl。

如果我在 requirejs 任务配置中指定了 './srv_dev' 的 baseUrl,那么它就找不到我的 config.js 文件。我已经尝试了各种方法来让它工作但没有运气。我认为 gruntfile 需要与 config.js 文件位于同一目录中,但这不是我的项目的设置方式。

谢谢大家!!!

这是我的 config.coffee 文件的全文

config =

  baseUrl: './'

  paths:
    # require plugins
    text             : '/components/requirejs-plugins/lib/text'
    json             : '/components/requirejs-plugins/src/json'

    # lib
    jquery           : '/components/jquery/jquery'
    bootstrap        : '/components/bootstrap/dist/js/bootstrap'
    lodash           : '/components/lodash/dist/lodash'
    backbone         : '/components/backbone/backbone'
    marionette       : '/components/marionette/lib/backbone.marionette.min'
    handlebars       : '/components/handlebars/handlebars'
    prism            : '/components/customPrism/prism'
    coffeescript     : '/components/coffee-script/extras/coffee-script'

    # app
    app              : '/app/app'
    appSettings      : '/app/appSettings'
    AppController    : '/app/AppController'
    AppRouter        : '/app/AppRouter'

    postMasterRecord : '/posts/postMasterRecord'

    util             : '/scripts/util'
    templates        : '/templates'
    handlebarsHelpers: '/scripts/handlebarsHelpers'

  shim:
    # lib
    bootstrap:
      deps: ['jquery']
    backbone:
      deps: ['lodash', 'jquery']
      exports: 'Backbone'
    marionette:
      deps: ['backbone', 'lodash', 'jquery']
      exports : 'Marionette'
    handlebars:
      exports: 'Handlebars'
    templates:
      deps: ['handlebars']

    # app
    app:
      deps: [
        'marionette'
        'bootstrap'
        'handlebars'
        'templates'
      ]

  # deps: ['app']

require.config(config)

require(['app'])

【问题讨论】:

    标签: javascript coffeescript requirejs gruntjs grunt-contrib-requirejs


    【解决方案1】:

    指定与mainConfigFilename 相同的文件是完全可以接受的,所以:

    requirejs:
      options:
        mainConfigFile: 'srv_dev/config.js'
        baseUrl: './srv_dev'
        name: 'config'
        findNestedDependencies: true
      dist:
        options:
          out: 'dist/script.js'
    

    mainConfigFile 告诉r.js“在这里你可以找到我的运行时配置”,而name 说“这是我的主模块”。一个并不意味着另一个。

    没有mainConfigFile r.js 无法找到您的运行时配置。如果没有name(或includemodules),它就无法知道您的应用程序的入口点是什么。

    r.js 需要findNestedDependencies: true 才能关注您的config.js 文件中的require([app])

    【讨论】:

    • 使用您提供的代码会生成一个 dist/script.js,它看起来与我原来的配置文件一模一样。其中声明的任何依赖项都不会添加到输出文件中。我已将我的 config.coffee 文件添加到问题中,以便您可以看到结构。也许我应该使用 app.js 作为我的“名字”??谢谢:)
    • 因此它使用 grunt-require-options 中的 baseUrl: './' 而不是 srv_dev 中的 config.coffee 文件中的 baseUrl: './'。基本上它寻找 deps 作为 gruntfile 的兄弟而不是配置的兄弟
    • 所以现在我陷入了这个混乱,如果 baseUrl 是 './srv_dev' 或者在 site/config.js 中查找配置: './srv_dev', name: 'config.js' } 由于某种原因,我无法让它在 site/srv_dev/config.js 中查找。
    • 是的,它目前看起来像这样 baseUrl: './srv_dev' name: 'config.js' 并且它寻找 config 作为 srv_dev 的兄弟,而不是它的内部。
    • 好的,越来越近了,感谢您的帮助...但是现在如果您查看 app.js 是如何在我的配置中加载的,它现在正在 srv_dev/app.js 中寻找 app 而不是遵循路径声明,如 srv_dev/app/app.js
    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2014-09-27
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多