-
-
Save orlin/1151166 to your computer and use it in GitHub Desktop.
| class exports.RootView extends Backbone.View | |
| el: $ '#container' | |
| template: '_.jade' | |
| initialize: -> | |
| _.bindAll @render | |
| render: -> | |
| $(@el).empty() | |
| $(@el).append jadeify @template | |
| # console.log('root view rendered') |
| # a piece of browserified express app | |
| # ... | |
| browserify = require 'browserify' | |
| jadeify = require 'jadeify' | |
| bundle = browserify | |
| require: [ 'underscore' | |
| , 'underscore.string' | |
| , 'backbone' | |
| , {jquery: 'jquery-browserify'} | |
| ] | |
| entry: ["#{__dirname}/app/index.coffee"] | |
| bundle.use jadeify "#{__dirname}/app/templates", | |
| watch: true | |
| extension: '.jade' | |
| # ... |
| window._ = require "underscore" | |
| window._.mixin require "underscore.string" | |
| require "./helpers.coffee" # = _.mixin(s) | |
| window.Backbone = require "backbone" | |
| window.jadeify = require "jadeify" | |
| window.onload = -> | |
| # Backbone app bootstrapping | |
| window.app = | |
| models: {} | |
| collections: {} | |
| views: {} | |
| initialize: -> | |
| this.views.home = new (require './views/_view').RootView() | |
| this.router = new (require('./router').ChartraRouter)() # last (it renders upon instantiation) | |
| # app.router.navigate 'home', true if Backbone.history.getFragment() is '' | |
| app.initialize() | |
| # console.log "#" + Backbone.history.getFragment() # ok | |
| # Backbone.history.start() # Uncaught TypeError: undefined is not a function | |
| # {root: '/', pushState: true, silent: true} | |
| # The document is in copletely ready state. | |
| if window.document.readyState is 'complete' | |
| window.onload() |
| class exports.ChartraRouter extends Backbone.Router | |
| routes: | |
| '': "home" | |
| blank: "blank" | |
| app: window.app | |
| initialize: -> | |
| this.navigate '', true # @home() | |
| # the it | |
| home: -> | |
| @app.views.home.render() | |
| # to illustrate Backbone.history #fail | |
| blank: -> | |
| $('#container').empty() | |
| $('#container').text('blank') |
I guess it's because backbone isn't quite browserifiable yet :)
Loding jquery, underscore and backbone through script tags fixed the error. I also stopped using jadeify because of other issues. I still like it for fileify (templates / data) and entry (easy coffee-script for the client side) and maybe other plugins too. Perhaps create a browserify issue if you need this fixed. I've otherwise communicated with @substack about it.
Any luck/feedback on this issue yet?
Yes, actually. You need to first 'npm install jquery', then modify Backbone.js to 'require('jquery')' as in line 35 here: https://github.com/Morriz/backbone-everywhere/blob/master/node_modules/backbone/backbone.js
from this repo: https://github.com/Morriz/backbone-everywhere
Thanks for the pointers. We solved it by patching backbone.js and then using a custom npm module and aliasing that inside browserify. Works like a charm.
I ended up loading backbone (and other libs) via ender. Browserify is still useful within the same project - just not being used to its possible max. Patching backbone.js seems like unnecessary maintenance...
Just keep in mind require(...) is contentious - many would like to claim it. Right now, I require Ender-ed libs first. Browserify requires next.
You don't have to manually patch any libraries to make them browserifiable anymore.
browserify-shim takes care of that for you
Works with all libraries I have encountered so far.
I get the same error when I call Backbone.start with pushState: true.
If you try in firefox, the error becomes '$ is not a function'.
Im also using browserify, and jquery-browserify. Let me know if you get this fixed!