Я использую BrunchJS для обработки сценария кофе и компиляции ресурсов. В проекте используется несколько плагинов Brunch, таких как brunch-handlebar, для работы которого требуется оболочка «commonjs».
Выдержка из моего config.coffee
modules:
# We cant avoid require js wrapping since brunch modules use commonjs
# Otherwise Marionnette JS offers its own modules loading strategy
# loading mechanism
wrapper: "commonjs"
definition: "commonjs"
На стороне Marionette у меня может быть простое приложение, загружающееся просто отлично.
index.html
<script type="text/javascript">
var app = require('application');
app.initialize()
</script>
application.coffee
# Загрузить хелперы блока handlebars требуют 'lib/view_helper'
class Application extends Backbone.Marionette.Application
initialize: =>
@addInitializer((options) =>
console.log "HELLO WORLD"
AppLayout = require 'views/app_layout'
@layout = new AppLayout()
@layout.render()
)
@start()
# module.exports is the object that's actually returned as the result of
# a require call.
module.exports = new Application()
Начиная оттуда, как мне использовать модули Marionette JS? Я читал об использовании модулей с AMD здесь https://github.com/marionettejs/backbone.marionette/wiki/AMD-Modules-vs-Marionette's-Modules, но я не могу использовать ключевое слово define в определении моего модуля марионетки, так как "define" и " требуют" не выставляются. Brunch использует его только для загрузки своих плагинов и исходных файлов моего приложения.
Обычный модуль Marionette выглядит так:
MyApp = new Backbone.Marionette.Application();
MyApp.module("Foo", function(){
// module code goes here
});
MyApp.start();
В отдельном файле moduleA.coffee я попытался сделать:
MyApp = require 'application'
define ["MyApp", "Marionette"], (MyApp, Marionette) ->
MyModule = MyApp.module("MyModule")
MyModule.addInitializer ->
console.log "HELLO FROM MODULE"
MyModule
Но define не определен.
Я также пытался сделать:
MyApp = require 'application'
MyApp.module "ModuleA", (MyApp, ModuleA, Backbone, Marionette, $, _) ->
ModuleA.addInitializer ->
console.log "HELLO FROM MODULE"
но тогда мне нужно потребовать все мои модули-марионетки ("moduleA") в application.coffee и столкнуться с некоторыми проблемами циклической зависимости.
Одно из решений, о котором я думаю, - отключить обертку BrunchJS commonjs и загружать рули из папки поставщика, а не как плагин для бранча.