javascript – mainConfigFile中的RequireJS Optimizer无法正常工作

我使用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)并定义稍后运行的调用.基本上我的单页应用程序的某些部分在用户点击它的链接之前不会加载,这会触发requrire()和define()调用.

我目前的问题似乎很基本……我已经设置了我的requirejs grunt任务,如下所示:

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

抛出错误:错误:缺少“名称”,“包含”或“模块”选项

我已经阅读了大多数优化器文档以及example build file,并且不明白这个错误发生了什么. this project中的tkellen使用almond.js的name选项 – 但我不认为我想这样做,因为我需要那些lazy – loader require()调用.示例构建文件指出:“仅指定模块名称意味着该模块将转换为包含其所有依赖项的构建文件.”这是我的下一次尝试:

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

有了这个,我得到错误:ENOENT,没有这样的文件或目录>> ‘/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'])

解决方法:

指定与mainConfigFile相同的文件和名称是完全可以接受的:

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

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

没有mainConfigFile,r.js无法找到您的运行时配置.没有名称(或包含或模块),它无法知道您的应用程序的入口点.

findNestedDependencies:如果r.js必须遵循config.js文件中的require([app]).

上一篇:[原创翻译]哪一种JavaScript方案适合你?


下一篇:javascript – backbone.js Model.get()使用coffeescript咖啡烤面包机返回undefined,scope?