2016-12-21 15 views
2

Гипотетический наследство сценарий:Как интегрировать унаследованный JavaScript с NodeJS в браузере

Say У меня есть 4 скрипты, которые просто получить объединяются вместе как единый сценарий для развертывания, чтобы обеспечить утилита библиотеку с глобальным пространством имен в браузере. У меня тогда есть 1 отдельный сценарий приложения, который использует библиотеку. Что-то вроде:

<script src="library.js"></script> 
<script src="app.js"></script> 

В моем app.js сценарии вызовы выполняются с методами библиотеки через его пространство имен, как

var id = lib.id(prefix); 

Я вижу, что один из библиотеки скриптов 4 полезная утилита что я хочу превратиться в модуль узла. Я копирую его и создаю пакет и публикую его в npm для использования в новой разработке.

Проблема: теперь у меня есть две версии этого скрипта для поддержки - одна для узла и одна для старой библиотеки.

Есть ли способ иметь один общий файл, который я могу включить как в модуль узла, так и в устаревшую библиотеку? Или я задерживаю сохранение двух версий файла до тех пор, пока мы не покончим с устаревшим кодом?

Дополнительная информация:

Я смотрел на browserify и WebPack, думая, что они могут быть полезны, но и страдают от проблемы, я не знаю, как обойти. Если конечный модуль не определяет глобальные переменные, я не могу использовать модуль в устаревшем коде, так как нет необходимости в наличии команды. Другими словами, я не могу обозревать модуль узла, а затем перетащить его на устаревшую веб-страницу и использовать его в моем существующем app.js, потому что я не могу позвонить var mymodule = require('mymodule'). Есть ли способ заставить браузеру или веб-пакет определить и выставить функцию require, чтобы я мог получить доступ к моему новому модулю узла из устаревшей кодовой базы? Конечно, это не уникальный сценарий.

+0

Я не использую webpack, но используя 'jspm' или' rollup', вы можете создать свой скрипт как UMD, поэтому его можно использовать как глобальное, AMD и Commonjs через обнаружение функции. – amenadiel

ответ

0

Ваш лучший выбор - использовать UMD pattern, чтобы гарантировать, что модуль может использоваться как глобальная, так и в общей системе JS (ie-node).

Образец, который подойдет вам лучше всего, это returnExports. Это гарантирует, что все экспортированные свойства либо применяются к глобальному объекту (т.е. к окну), либо к объекту модуля в узле.

Поскольку вы не используете AMD, вы можете упростить картину несколько и удалить первый кусок, если заявления по линиям 18 и 42.

Это потребует от вас реорганизовать свой код так, чтобы он вписывается в шаблон.

Есть другие шаблоны, которые вы можете использовать, например commonJsStrictGlobal, но я лично предпочитаю returnExports.

+0

Это, похоже, не касается моей проблемы, поэтому мне нужно более четко заявить о своей проблеме. Представьте, что у меня есть 4 (устаревшие) скрипты, объединенные вместе в один скрипт. Скажем, я беру сценарий №2 и копирую его в другой проект, создаю модуль узла из него и публикую его через npm. Теперь я хочу заменить скрипт # 2 в моем устаревшем коде, по сути, требовать вызова. Или вы говорите, что я бы каким-то образом включил новый файл сценария из проекта узла, предположив, что я пишу его с использованием шаблона UMD? Если да, то как получить доступ к нему из модуля npm? – user1588877

+0

Да.Идея состоит в том, что вы можете использовать * точно * тот же файл в узле (т. Е. Как обычный JS-модуль), а также в теге скрипта (т. Е. В глобальном контексте). Предположительно, вы опубликуете вариант UMD файла как модуль npm. После его установки вы, скорее всего, захотите создать шаг сборки (используя скрипты gulp, grunt, npm или ваш любимый бегун), который скопирует нужный файл UMD в нужное место в вашем веб-приложении. Поскольку вы используете шаблон UMD, вы сможете напрямую получить доступ к глобальным переменным из вашего сценария # 2. –

+0

Я вижу, что вы говорите, что скрипты конкатенированы, но ваш вопрос выше использует отдельные теги сценария. Это не имеет большого значения. Если они объединены, вам просто нужно убедиться, что вы захватили надлежащий файл из модуля npm для конкатенации. –