Вопрос по node.js, javascript, package-managers, npm – Как я могу использовать npm для внешних зависимостей?

37

Я хочу спросить, возможно ли (и вообще хорошая идея) использовать npm для обработки внешних зависимостей (Backbone, jQuery).

Я обнаружил, что Backbone, jQuery и т. Д. Доступны через npm, но мне пришлось бы установить другую точку извлечения (по умолчаниюnode_modules) или символическая ссылка или что-то еще ...

Кто-нибудь делал это раньше?

Является ли это возможным?

Что я должен изменить вpackage.json?

Оба эти комментария довольно неактуальны. Jehan
Просто используйте инструмент вроде browserify для переноса кода в стиле узла в браузер Raynos
Смотрите мой ответ ниже. Bower - довольно новый менеджер пакетов! Chris Bier

Ваш Ответ

5   ответов
17

+1 за использование Browserify..org и любим это. Лучшее введение и обоснование Browserify можно найти вСправочник по Browserify, Такие темы, как CommonJS & amp; Решения AMD, сборка конвейеров и тестирование рассматриваются там.

Основная причина, по которой Browserify так хорошо работает, заключается в том, что он прозрачно работает с NPM. Пока модуль может требоваться, он может быть Browserified (хотя не все модули сделаны для работы в браузере).

Основы:

npm install jquery-browserify

main.js

var $ = require('jquery-browserify');
$("img[attr$='png']").hide();

Затем запустите:

browserify main.js > bundle.js

Затем включитеbundle.js в вашем HTML-документе и код вmain.js выполню.

Я думаю ты имеешь ввидуbundled.js и неbundle.js
Ах я имел ввидуbundle.js, Спасибо за улов!
5

Путевой обходчик для создания фасадных проектов. Инструмент основан на узлах, поэтому проект использует множество модулей npm, которые работаютserver-side строить свои активы, но из коробки он ожидает найти вашclient-side Зависимости в скопированы и приверженыvendor/js.

Однако многие ребята (включая меня) попытались интегрироваться с browserify, и мы столкнулись с множеством сложностей и проблем, начиная с (a) модулей npm, поддерживаемых третьей стороной, которые либо устарели, либо добавляют нежелательные изменения (б) реальных библиотек, которые начинают загружаться при загрузкеtraditionally всякий раз, когда функция верхнего уровня с именемrequire определяется даже из-за багажа AMD / Require.js.

Моя краткосрочная рекомендация - держаться и придерживаться хороших старых идей. вылепил сценарий сочленения, пока не осядет пыль. Пока у вас не возникнут проблемы, достаточно большие или сложные, чтобы их оправдать, я подозреваю, что вы потратите больше времени на отладку и исправление своей сборки, чем в противном случае. И я думаю, что большинство из нас согласны с тем, что наилучшее использование вашего времени сосредоточено на коде вашего приложения, а не на инструментах его сборки.

Привет Джастин. Мне не нравится, что это лучший ответ, но он все еще таков. Я только что закончил проект, который использовал систему интерфейсных модулей (brunch), но мы все еще не пытались загрузить наши зависимости из менеджера пакетов, не говоря уже оnpm, который (при необходимости) полон специфичного для узла кода.
16

sort of.

Это в значительной степени зависит от автора модуля, но это не распространено. Socket.io является примером такого вспомогательного модуля, как показано на его целевой странице. Однако есть и другие решения. Вот две вещи, о которых я действительно знаю что-либо:

http://ender.no.de/ - Ender JS, self-described NPM analogue for client modules. A bit too involved for my tastes. https://github.com/substack/node-browserify - Browserify, a utility that will walk your dependencies and allow you to output a single script by emulating the node.js module pattern. You can use a jake|cake|rake|make build script to spit out your application.js, and even automate it if you want to get fancy. I used this briefly, but decided it was a bit clunky, and became annoying to debug. Also, not all dual-environment npm modules like to be run through browserify.

Лично я в настоящее время выбираю использовать RequireJS (http://requirejs.org/ ) и вручную управлять моими модулями, аналогично тому, как Mozilla делает с их примером приложения BrowserQuest (https://github.com/mozilla/BrowserQuest ). Обратите внимание, что это связано с необходимостью создания таких модулей, как магистраль или подчеркивание, что исключило поддержку загрузчиков модулей в стиле AMD. Вы можете найти пример того, что входит в шимминг здесь:http://tbranyen.com/post/amdrequirejs-shim-plugin-for-loading-incompatible-javascript

На самом деле кажется, что будет больно, несмотря ни на что, поэтому поддержка нативных модулей является такой горячей темой.

Привет, спасибо за быстрый ответ! Я уже использую requirejs в своем приложении, даже я не очень с ним знаком. Однако я немного отклонил то, как вы используете RequireJs для node_modules. Вы устанавливаете пакет через npm и затем добавляете путь (node_modules / jquery / index) в main.js или я что-то пропустил? dev.pus
К сожалению, он даже не будет напрямую использовать node_modules. Вместо этого вы должны хранить отдельную папку lib со своими клиентскими зависимостями / прокладками. У меня также есть пример (начните с application.js):github.com/steveorsomethin/umlol/tree/master/client
Хорошо, это почти то же самое, что я делаю в данный момент. Однако спасибо за вашу помощь. Теперь я знаю, что нет менеджера клиент-пакетов :) dev.pus
Кстати. Магистраль теперь имеет поддержку AMD.
Нет проблем :) Кроме того, ender МОЖЕТ по-прежнему служить вашим потребностям, поскольку он стремится быть npm-совместимым. Вам просто нужно сделать вложение и посмотреть, подходит ли оно.
1

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

У меня не было возможности детально сравнить browserify и webmake, но я заметил, что webmake не очень хорошо работает с модулями, использующими глобальные переменные, такие как socket.io (который в любом случае полон раздувания IMO).

Я буду осторожен с RequireJS, который был рекомендован выше. Потому что этоAMD loaderВаш браузер будет загружать ваши файлы JS асинхронно. Это вызовет больше обменов между вашим клиентом и сервером и может ухудшить UX людей, просматривающих из мобильных сетей / под плохой WiFi. Более того, если вам удастся сохранить свой код JS простым и крошечным, асинхронная загрузка абсолютно не нужна!

1

http://jspm.io/ который является менеджером пакетов браузера. Имеет хорошую поддержку ES6 тоже.

Похожие вопросы