2013-06-20 79 views
4

我正在使用grunt-browserify并特别遇到两个问题。使用以下配置选项成功启动并运行任务。变量jsFilesToConcat代表Backbone.js + Marionette.js应用程序的所有JavaScript文件,主应用程序定义,前端实用程序资产(例如Bootstrap插件)以及与项目相关的所有JS。这是错误的方法?这个想法是一次加载整个250k JS应用程序(以及它的所有依赖项)。Backbone.Marionette - Grunt Browserify - “require is not defined”

我想提供的声明,这对我来说是一个新的领域,所以我觉得我的预期使用情况下可与已经可用插件的选项,但我的两个错误很困惑:

1 )Backbone not defined - 这意味着脚本实际上正在加载,但是,当我在Chrome Dev Tools中检查调用堆栈时,它只显示匿名自调用函数。所以我不清楚如何将Backbone对象传递给Marionette,以便在加载时进行扩展。

2)require is not defined - 我声明的线路错误var SampleApp = require('SampleApp')。我需要在我的grunt配置中做些特别的事情,或者需要在node.js server.js配置文件中公开require函数?

3)javascript本身是异步执行的,这是我不能正确处理的browserify预期行为的一部分吗?我认为,因为我在全局包装中包装了很多JS实用程序来保护名称空间,这就是某些函数不可用的原因,但我不清楚为什么会影响require

// uses grunt-browserify task 
    browserify: { 
     developmentJs: { 
      options: { 
       debug: true, 
       alias: ["./js/app.dev.js:SampleApp"], 
      }, 
      src: [ 
       '<%= pkg.jsFilesToConcat %>' 
      ], 
      dest: 'public-dev/js/app.dev.js' 
     } 
    } 

,然后在我的单页木偶应用的index.html,我有。

(function ($) { 
     $(document).ready(function() { 
      var sampleApp = require('SampleApp'); 
      console.log(SampleApp); 
     }); 
    })(jQuery); 
+0

在配置中有一个别名应该使得require()暴露AFAIK。你看看生成的'public-dev/js/app.dev.js'文件吗?另外,为了确保你在index.html中正确包含了public-dev/js/app.dev.js? –

+0

@AmitayDobo我认为是一样的,但我遇到了同样的问题,需要不被全局定义 – pixshatterer

回答

0

对于初学者来说,grunt文件中的src属性不需要引用应用程序中的所有文件。它只需要一个入口点。所以通常我在index.js文件中有类似于匿名自执行功能的东西,并将我的src配置选项设置为["./index.js"]。当browserify查看该文件时,它将检查需要的调用并获取所有必需的依赖关系。

也就是说,browserify将生成一个内部定义为require的文件。 require函数在页面上不是全局可用的,您所要求的依赖项也不是。您可以在应用程序中使用它们,但这并不能使它们在页面中可用。因此,如果你得到的Backbone没有定义错误,我首先要检查的是你已经通过npm安装了主干(npm install backbone --save)。

一旦设置好了,你只需要在页面上包含你的编译脚本,并让你的匿名自执行函数(现在应该在grunt-browserify正在处理的文件中)完成启动工作你的申请。

相关问题