【问题标题】:How to use Requirejs-handlebars with Grunt-contrib-requirejs optimizer?如何将 Requirejs-handlebars 与 Grunt-contrib-requirejs 优化器一起使用?
【发布时间】:2015-04-11 23:20:11
【问题描述】:

我目前正在使用 Grunt-contrib-requirejs 优化器,因此我的最终包结构基本上如下所示:

Public/
  css
  js
   -myapp.js
   -require.js

我想使用 requirejs-handlebars 来呈现我的模板(也在服务器端使用 Express3-handlebars)。我已经让 NPM 包 requirejs-handlebars 工作了,但前提是我使用以下行在我的快速服务器中公开模块:

app.use('/node_modules/handlebars/dist/',  express.static(path.join(__dirname, './node_modules/handlebars/dist/' )));

如果不进行此修复,我会在加载我的应用时收到以下控制台错误:

获取http://localhost:3300/node_modules/handlebars/dist/handlebars.runtime.amd.js require.js:166 未捕获的错误:脚本错误:handlebars.runtime

我猜这个错误是由我的最终构建结构和我的 require 优化器造成的。由于显而易见的原因,该脚本不存在,因为我的最终构建结构没有包含它。我想我想要的是不必使用 express 中间件包含 handlebars.runtime,或者将它与我的最终 myapp.js 合并(我不确定这样做的最佳方法是什么)。有任何想法吗?很抱歉,我们将不胜感激任何建议!

谢谢!

我的 main.js 文件如下所示:

   require.config({
  shim: {
    jquery: {
      exports: '$'
    },
    underscore: {
      exports: '_'
    },
    backbone: {
      deps: [
        'jquery',
        'underscore'
      ],
      exports: 'Backbone'
    },
    marionette: {
      deps: [
        'jquery',
        'underscore',
        'backbone'
      ],
      exports: 'Marionette'
    },
    bootstrap: {
      deps: [
        'jquery'
      ]
    }
  },
  paths: {
    backbone: '../../bower_components/backbone/backbone',
    marionette: '../../bower_components/backbone.marionette/lib/backbone.marionette',
    jquery: '../../bower_components/jquery/jquery',
    underscore: '../../bower_components/underscore/underscore',
    requirejs: '../../bower_components/requirejs/require',
    text: '../../node_modules/requirejs-text/text',
    hb: '../../node_modules/requirejs-handlebars/hb',
    'handlebars.runtime': '../../node_modules/handlebars/dist/handlebars.runtime.amd',
  },
  packages: [
    {
      name: 'handlebars',
      location: '../../node_modules/handlebars/dist/amd',
      main: './handlebars'
    }
  ]
});


require([
  './app',
], function(App){

  'use strict';
  var myapp = new App();
  myapp.start();

});

我的 Gruntfile:

     requirejs: {
          compile: {
            options: {
              baseUrl: "client/src",
              optimize: '', //uglify
              mainConfigFile:'client/src/main.js',
              name: "main",
              out: "build/app.js",
              removeCombined: true,
              logLevel: 0,
              findNestedDependencies: true,
              fileExclusionRegExp: /^\./,
              inlineText: true,
            }
          },
     },

【问题讨论】:

    标签: javascript node.js requirejs handlebars.js require-handlebars


    【解决方案1】:

    似乎 grunt requirejs 没有内联 handlebars.runtime 模块,这就是为什么您必须在 express 代码中为其添加远程路由。

    我设法通过为车把和车把.runtime 声明路径来修复它,而且我还必须对它们进行填充。所以,我的 main.js 看起来是这样的:

    paths: {
        'handlebars.runtime': '../bower_components/handlebars/handlebars.runtime',
        handlebars: '../bower_components/handlebars/handlebars',
        hbs: '../bower_components/requirejs-handlebars/hb',
    },
    shim: {
        'handlebars.runtime': {
            exports: 'handlebars.runtime'
        },
        handlebars: {
            deps: ['handlebars.runtime']
        },
    }
    

    现在,当我发出 grunt build 时,我可以看到 handlebars 和 handlebars.runtime 都内联到我的 app.js 中。这应该使您不必从 express 中公开 node_modules 目录。

    【讨论】:

    • 谢谢!完美地解决了它。完全让我开心。 :D 如果您不介意我问,您如何在项目中引用 require.js?现在我在我的快速代码中将它作为远程路由公开(使用 bower_components),但我不确定这是否是最好的方法。
    • 很高兴为您服务!为了让其他观众更容易看到答案,您可以将答案标记为答案并点赞吗?为了回答您的问题,我可能会以与您相同的方式引用 require.js,通过一个看起来像这样的脚本标签:<script data-main="/js/main" src="/bower_components/requirejs/require.js"></script>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多