2015-10-07 5 views
0

У меня есть модуль, который требует подчеркивание:Пакетирования подчеркивает с JSPM

import _ from "underscore" 

var numbers = [1, 4, 6, 7, 9, 3, 22, 11, 54, 99, 100]; 
var evens = _.filter(numbers, x => x % 2 === 0); 

document.getElementById('output').innerText = evens; 

Это прекрасно работает в моем глотке задаче:

gulp.task('process-scripts', function(cb) { 
    var builder = new Builder('Scripts', 'Scripts/config.js'); 
    builder.buildStatic('main.js', 'app/main.min.js', { minify: true }); 
    cb(); 
}); 

И с этим тегом сценария:

<script src="/app/main.min.js"></script> 

Проблема в том, что я хочу вывести подчеркивание в свой собственный скрипт. Так что я изменил мою глотком задачу:

gulp.task('process-scripts', function(cb) { 
    var builder = new Builder('Scripts', 'Scripts/config.js'); 
    builder.buildStatic('underscore', 'app/vendor.min.js', { minify: true }); 
    builder.buildStatic('main.js - underscore', 'app/main.min.js', { minify: true, globalDeps: {underscore: '_'} }); 
    cb(); 
}); 

Это, я получаю подчеркивание вытаскивают из основного пучка и положить в комплект поставки поставщика. В нижней части main.min.js, пучок создает этот код:

(function(factory) { 
    factory(_); 
}); 

И я получаю ошибку: «неперехваченным ReferenceError: _ не определен»

Я попытался это то же самое с помощью JQuery в место подчеркивания, и он работал просто отлично. То, что я заметил при прохождении кода, заключается в том, что, когда вызывается код в нижней части main, на объекте окна был найден $, и поэтому ошибок не было.

Как я могу заставить основной модуль распознавать подчеркивание в сценарии поставщика?

+0

вы включают в себя приложение/vendor.min.js до приложения/main.min.js? только приложение/vendor.min.js объявляет _ как глобальную переменную? –

+0

Да, тег сценария app/vendor.min.js появляется перед app/main.min.js Файл vendor.min.js является только подчеркиванием, которое было установлено с помощью 'jspm install underscore' Это на карте объект config.js как: ..., карты: { "подчеркивание": "НПМ: [email protected]" }, ... –

ответ

0

Если вы создаете самопроизвольный пакет для npm: подчеркните, что _ не добавляется к объекту окна. Поэтому ваш основной модуль не может получить к нему доступа ни import _ from 'underscore', ни через window._.

Если вы хотите связать свое приложение в отдельных модулях, вам следует создать просто пакеты с помощью builder.bundle() в пользу самоисполняющихся пакетов. Таким образом, вы должны использовать system.js для загрузки ваших скриптов, но вы сможете получить доступ к узлу подчёркивания в вашем модуле приложения.

Например:

System.import('app/vendor').then(() => { 
    System.import('app/main'); 
}); 
+0

Любая идея, почему '_' не добавляются в объект окна? Кажется, что '' '' '' '' jQuery добавляется просто отлично. Связано ли это с тем, как jQuery упакован по сравнению с подчеркиванием? –

+0

Да. Когда вы смотрите на источник, вы видите, что jquery добавляется в окно при загрузке в среде браузера: 'if (typeof noGlobal === strundefined) { window.jQuery = window. $ = JQuery; } ' Существует также обсуждение, почему jquery делает это (https://github.com/jquery/jquery/pull/557). подчеркивание просто экспортирует '_'. Поэтому он должен быть импортирован явно. – LazerBass