4

我正在使用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

我已经阅读了大部分优化器文档以及示例构建文件,但不明白这个错误是怎么回事。这个项目中的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'])
4

1 回答 1

3

指定与您的文件相同的文件是完全可以接受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),它就无法知道您的应用程序的入口点是什么。

findNestedDependencies: true需要r.js遵循require([app])您的config.js文件中的内容。

于 2014-03-17T19:40:10.917 回答