Подтвердить что ты не робот

Как смешивать плагины поддерева в 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:

4b9b3361

Ответ 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());