11

Was ist der richtige Weg, Code auf Underscore auszuführen, wenn es geladen wird? Ich versuche, den folgenden Code auszuführen, um den _ exportierten Namensraum automatisch zu verlängern, wenn Module, die es erfordert:Wie mische ich Underscore Plugins in RequireJS?

_.mixin(_.str.exports()); 

Die docs etwas vage, aber ich denke, ich habe es in der Shim init Abschnitt? Ich habe versucht, die folgenden, aber ich kann nicht einmal einen Breakpoint schlagen in der init erhalten:

require.config({ 
    paths: { 
     jquery: 'libs/jquery/jquery.min', 
     underscore: 'libs/underscore/lodash.min', 
     underscorestring: 'libs/underscore/underscore.string.min' 
    }, 

    shim: { 
     underscore: { 
      exports: '_' 
     } 
     underscorestring: { 
      deps: ['underscore'], 
      init: function (_) { 
       //Mixin plugin to namespace 
       _.mixin(_.str.exports()); 

       return _; 
      } 
     } 
    } 
}); 

Wenn ich versuche, dies zu tun und nutzen underscorestring, bekomme ich diesen Fehler:

Uncaught TypeError: Object function s(e){return new o(e)} has no method 'startsWith'

Text & Tabellen:

Antwort

19

Ich weiß nicht, ob es der richtige Weg ist, aber ich habe es durch die Arbeit Dinge invertiert, so dass Strich auf underscore.string abhängt . Auf diese Weise müssen Sie auch nicht unterstrich.string benötigen.

require.config({ 
    shim: { 
    'backbone': { 
     deps: ['underscore', 'jquery'], 
     exports: 'Backbone' 
    }, 
    'underscore': { 
     deps: ['underscore.string'], 
     exports: '_', 
     init: function(UnderscoreString) { 
     _.mixin(UnderscoreString); 
     } 
    } 
    }, 
    paths: { 
    'backbone'   : 'lib/backbone', 
    'jquery'   : 'lib/jquery/jquery', 
    'text'    : 'lib/require/text', 
    'underscore'  : 'lib/underscore', 
    'underscore.string' : 'lib/underscore.string' 
    } 
}); 

.

Update: 3/14/2014

Underscore.js v1.6.0 brachte AMD Kompatibilität und init() wurde von RequireJS entfernt, so dass einige Refactoring ist in Ordnung. Um weiterhin Underscore mit Underscore.string vorgeladen zu bekommen, habe ich ein Mixer-Modul erstellt, um sie zusammen zu ziehen.

New Require.js Config

requirejs.config({ 
    paths: { 
    'backbone'   : '../lib/backbone/backbone', 
    'backbone.base'  : '../lib/backbone/backbone.base', 
    'backbone.extensions' : '../lib/backbone/backbone.extensions', 
    'jquery'    : '../lib/jquery/jquery', 
    'text'    : '../lib/require/text', 
    'underscore'   : '../lib/underscore/underscore', 
    'underscore.mixed' : '../lib/underscore/underscore.mixed', 
    'underscore.string' : '../lib/underscore/underscore.string' 
    }, 
    shim: { 
    'backbone.base': { 
     deps: ['underscore.mixed', 'jquery'], 
     exports: 'Backbone' 
    }, 
    } 
}); 

underscore.mixed

define([ 
    'underscore', 
    'underscore.string' 
], function(_, _s) { 
    _.mixin(_s.exports()); 
    return _; 
}); 

Der letzte Schritt ist es, alle Instanzen von 'underscore' mit 'underscore.mixed' in Moduldefinitionen zu ersetzen. Ich habe versucht, Underscore in eine Datei namens underscore.base.js zu verschieben und den normalen underscore Mixer zu machen (wie das Backbone-Setup), um diesen Schritt zu vermeiden. Underscore, ein namens Modul zu sein, stimmte nicht mit dem Plan überein.

+2

JA definieren konnte - mich gerettet Stunden – hharnisc

+0

Es spielt keine‘ t scheint "init" arbeitet in der Shim mit den neuesten RequireJS. Sehen Sie sich stattdessen diese Technik an: http://blog.falafel.com/Blogs/basem-emara/2014/02/17/the-lo-dash-on-undderscore.js-and-strings – TruMan1

+0

Sie können die 'map verwenden 'Eigenschaft, um 'Unterstrich' effektiv zu Ihrem 'Unterstrich.mixed' umzubenennen. Siehe http://requirejs.org/docs/jquery.html#noconflictmap –

3

Haben Sie benötigen Unterstrich irgendwo? Denn wenn es nicht benötigt wird, wird es nicht geladen. ich es geschafft, um es mit fast genau den gleichen Code arbeiten Sie auf dem Laufenden:

require.config({ 
    paths: { 
     underscore: [ 
      '//raw.github.com/documentcloud/underscore/master/underscore-min' 
     , 'lib/underscore' 
     ] 
    , underscorestring: 'https://raw.github.com/epeli/underscore.string/master/dist/underscore.string.min' 
    } 
, shim: { 
     underscore: { exports: '_' }, 
     underscorestring: { 
      deps: ['underscore'], 
      init: function(_) { 
       _.mixin(_.str.exports()); 
       return _; // guess, this is not needed. 
      } 
     } 
    } 
, exclude: ['underscore'] 
}); 

require(['underscore', 'underscorestring'], function(_) { 
    console.log(_.chars("i'm a happy string.")); 
}); 
0

stundenlang mit diesem Battling, bevor ich verstehen, was ich falsch mache

Dies ist, was ich falsch

tat

Sie sollten nicht die Datei umbenennen in Haupt underscore.string.js

obwohl in meiner Bibliothek habe ich die Datei in Pfade umbenennen ich es nennen zurück zu ‚underscore.string‘

Dies ist, wie Sie Ihre main.js wie

require.config({ 
paths: { 
    underscore: 'lib/underscore', 
    'underscore.string' : 'lib/_string' , 
}, 
shim: { 
    underscore: { 
     exports: '_', 
     deps: [ 'jquery', 'jqueryui' ] 
    }, 
    'underscore.string': { 
     deps: [ 'underscore' ] 
    }, 
} 
.... 
aussehen sollte

Sie könnten dann entweder fügen Sie es als Abhängigkeit mit in Ihre Shim, wie ich für meine mixin Datei tat

shim: { 
    mixin : { 
     deps: [ 'jquery', 'underscore', 'underscore.string' , 'bootstrap' ] 
    }, 

Oder nur es in den verschiedenen Seiten definieren wie

/*global define */ 
define([  
    'underscore.string' 
], function () { 

es funktioniert gerade Sie es durch _.str zugreifen können oder _.string

Dies ist warum Sie es auf diese Weise tun sollten und nicht versuchen, es zu nennen etwas anderes

auf Linie 663 von underscore.string.js

// Register as a named module with AMD. 
    if (typeof define === 'function' && define.amd) 
    define('underscore.string', [], function(){ return _s; }); 

was bedeutet, dass es nur registrieren, wird es mit AMD benötigen JS wenn Sie definieren

Für Mix ‚underscore.string‘ in die Sie gerade mit

/*global define */ 
define([  
    'underscore', 
    'underscore.string' 
], function () { 
    _.mixin(_.str.exports());