Как смешивать плагины поддерева в RequJS?
Каков правильный способ выполнения кода на Underscore при загрузке? Я пытаюсь выполнить приведенный ниже код, чтобы автоматически расширять пространство, экспортированное им, когда модули нуждаются в нем:
_.mixin(_.str.exports());
Документы немного расплывчаты, но я думаю, что я поместил их в секцию инициализации shim. Я попробовал следующее, но я даже не могу получить точку останова для запуска в init:
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 _;
}
}
}
});
Когда я пытаюсь это сделать и использую underscorestring, я получаю эту ошибку:
Uncaught TypeError: функция объекта s (e) {return new o (e)} не имеет метод 'startsWith'
Docs:
Ответы
Ответ 1
Я не знаю, правильно ли это, но я заставил его работать, инвертируя все, чтобы подчеркивание зависело от underscore.string. Кроме того, таким образом вам не нужно требовать underscore.string.
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'
}
});
.
Обновление: 3/14/2014
Underscore.js v1.6.0 вернул совместимость AMD и init()
был удален из RequireJS, поэтому некоторые рефакторинги в порядке. Чтобы продолжить загрузку Underscore с помощью Underscore.string, я сделал модуль микшера, чтобы вытащить их вместе.
Новая конфигурация Require.js
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 _;
});
Последний шаг - заменить все экземпляры 'underscore'
на 'underscore.mixed'
в определениях модулей. Я попытался переместить Underscore в файл с именем underscore.base.js
и сделать обычный underscore
микшер (например, настройку базовой линии), чтобы избежать этого шага. Подчеркивание, являющееся именованным модулем, не согласуется с планом.
Ответ 2
Требуется ли вам некорректность? Потому что, если он не требуется, он не будет загружен.
Мне удалось заставить его работать почти с тем же кодом, который вы опубликовали:
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.") );
});
Ответ 3
Борясь с этим в течение нескольких часов, прежде чем я понимаю, что я делаю неправильно
Вот что я сделал неправильно
Нельзя переименовывать файл underscore.string в main.js
хотя в моей библиотеке я переименовал файл в пути, я назову его обратно в 'underscore.string'
Вот как ваш main.js должен выглядеть как
require.config({
paths: {
underscore: 'lib/underscore',
'underscore.string' : 'lib/_string' ,
},
shim: {
underscore: {
exports: '_',
deps: [ 'jquery', 'jqueryui' ]
},
'underscore.string': {
deps: [ 'underscore' ]
},
}
....
Затем вы можете добавить его как зависимость с помощью прокладки, как я сделал для моего файла mixin
shim: {
mixin : {
deps: [ 'jquery', 'underscore', 'underscore.string' , 'bootstrap' ]
},
Или просто определить его на разных страницах, например
/*global define */
define([
'underscore.string'
], function ( ) {
он просто работает, теперь вы можете получить доступ к нему через _.str или _.string
Это почему, вы должны сделать это таким образом и не пытаться называть его чем-то другим
в строке 663 файла underscore.string.js
// Register as a named module with AMD.
if (typeof define === 'function' && define.amd)
define('underscore.string', [], function(){ return _s; });
Это означает, что он зарегистрирует его только в том случае, если AMD требует JS, если вы определяете "underscore.string"
Для смешивания вы можете просто определить
/*global define */
define([
'underscore',
'underscore.string'
], function ( ) {
_.mixin(_.str.exports());