NPM vs. Bower vs. Browserify vs. Gulp vs. Grunt vs. Webpack


1886

Я намагаюся узагальнити свої знання про найпопулярніших менеджерів пакетів JavaScript, постачальників та виконавців завдань. Будь ласка, виправте мене, якщо я помиляюся:

  • npm& bowerє менеджерами пакетів. Вони просто завантажують залежності і не знають, як самостійно будувати проекти. Що вони знають - це зателефонувати webpack/ gulp/ gruntпісля отримання всіх залежностей.
  • bowerце як npm, але будує дерева з урівноваженою залежністю (на відміну від npmрекурсивного). Значення npmотримує залежності для кожної залежності (може отримати одне і те ж кілька разів), тоді як bowerви очікуєте, що ви вручну включите підзалежності. Іноді bowerі npmвикористовуються разом для фронтального та заднього кінців відповідно (оскільки кожен мегабайт може мати значення в передній частині).
  • gruntі gulpвони виконують завдання, щоб автоматизувати все, що можна автоматизувати (тобто компілювати CSS / Sass, оптимізувати зображення, робити пакет і мінімізувати / транспілювати його).
  • gruntпо порівнянні з gulp(подібно mavenпроти gradleабо конфігурації проти коду). Грунт заснований на налаштуванні окремих незалежних завдань, кожне завдання відкриває / обробляє / закриває файл. Gulp вимагає меншої кількості коду та базується на потоках Node, що дозволяє йому будувати трубопровідні ланцюги (без повторного відкриття того ж файлу) та робить його швидшим.
  • webpack( webpack-dev-server) - для мене це виконавець завдань з гарячим перезавантаженням змін, що дозволяє забути про всіх спостерігачів JS / CSS.
  • npm/ bower+ плагіни можуть замінити бігу задач. Їх здібності часто перетинаються, тому є різні наслідки, якщо вам потрібно використовувати gulp/ gruntнад npm+ плагіни. Але виконавці завдань, безумовно, краще для складних завдань (наприклад, "на кожній збірці створюйте пакет, транспілюйте з ES6 в ES5, запускайте його на всіх емуляторах браузерів, створюйте скріншоти та розгортайте до папки через ftp").
  • browserifyдозволяє модулі вузлів упаковки для браузерів. browserifyпроти node«s requireнасправді AMD проти CommonJS .

Запитання:

  1. Що таке webpack& webpack-dev-server? В офіційній документації йдеться про модульний пакет, але для мене це лише виконавець завдань. Яка різниця?
  2. Де б ви не використовували browserify? Чи не можемо ми зробити те ж саме з імпортом вузла / ES6?
  3. Коли ви будете використовувати gulp/ gruntнад npm+ плагіни?
  4. Наведіть приклади, коли вам потрібно використовувати комбінацію

52
час , щоб додати в накопичувальному пакеті ? 😝
gman

167
це дуже розумне питання. pseudo web-devs, як я, натрапляю на всі пакунки, що реалізуються щотижня.
Simon Dirmeier


41
@Fisherman Я абсолютно новачок у цьому, і це здається абсолютно горішком ...
Девід Стосик

13
@Fisherman "Рекомендований" коментар, який я щойно прочитав, був ще гіршим! D: Я просто хочу створити вигадливу статичну сторінку, яка використовує пару CSS / JS-ліфтів, і я отримав би користь від того, щоб мати інструмент, який може компілювати це разом ... Закиньте в якийсь двигун-шаблонник, щоб трохи відпочити моєму Ctrl-C / Ctrl-V пальці, і це було б ідеально ... І все ж, годинами, все ще намагаючись знайти шлях ...
Девід Стосик

Відповіді:


1028

Вебпак та перегляд

Webpack та Browrify виконують майже таку ж роботу, яка обробляє ваш код для використання в цільовому середовищі (в основному браузері, хоча ви можете орієнтуватися на інші середовища, такі як Node). Результатом такої обробки є один або кілька пакетів - зібраних сценаріїв, придатних для цільового середовища.

Наприклад, скажімо, що ви написали код ES6, розділений на модулі, і хочете мати змогу запускати його у браузері. Якщо ці модулі є модулями Вузол, браузер їх не зрозуміє, оскільки вони існують лише в середовищі Вузол. Модулі ES6 також не працюватимуть у старих браузерах, таких як IE11. Більше того, можливо, ви використовували експериментальні мовні функції (наступні пропозиції ES), які браузери ще не реалізують, тому виконання такого сценарію просто призведе до помилок. Такі засоби, як Webpack і Browrify вирішують ці проблеми, перекладаючи такий код у форму, яку браузер може виконати . Крім того, вони дозволяють застосувати величезну кількість оптимізацій для цих пакетів.

Однак Webpack та Browrify багато в чому відрізняються, Webpack пропонує безліч інструментів за замовчуванням (наприклад, розбиття коду), тоді як Browrify може це робити лише після завантаження плагінів, але використовуючи обидва, призводить до дуже схожих результатів . Це зводиться до особистих переваг (Webpack є моднішим). Btw, Webpack - це не виконавець завдань, це лише процесор ваших файлів (він обробляє їх так званими завантажувачами та плагінами), і його можна запускати (серед інших способів) бігуном завдань.


Webpack Dev Server

Webpack Dev Server пропонує аналогічне рішення для Browsersync - сервера розробок, де ви можете швидко розгортати додаток під час роботи над ним і негайно перевіряти свій прогрес в розробці, при цьому сервер розробників автоматично оновлює браузер щодо зміни коду або навіть розповсюдження зміненого коду до браузера без перезавантаження з так званою гарячою заміною модуля.


Завдання бігунів проти NPM-скриптів

Я використовую Gulp для його лаконічності та простого написання завдань, але згодом з’ясував, що мені зовсім не потрібні ні Gulp, ні Grunt. Все, що мені було потрібно, можна було б зробити за допомогою сценаріїв NPM для запуску сторонніх інструментів через їх API. Вибір між сценаріями Gulp, Grunt або NPM залежить від смаку та досвіду вашої команди.

Хоча завдання в Gulp або Grunt легко читати навіть людям, які не так знайомі з JS, це ще один інструмент, який вимагають і навчаються, і я особисто вважаю за краще звузити свої залежності і зробити прості речі. З іншого боку, заміна цих завдань комбінацією сценаріїв NPM та (можливо, JS) скриптів, які запускають ці сторонні інструменти (наприклад, налаштування сценарію вузла та запуск rimraf для цілей очищення) може бути складнішою. Але в більшості випадків ці три рівні за своїми результатами.


Приклади

Що стосується прикладів, я пропоную вам ознайомитись із цим початковим проектом React , який показує вам гарне поєднання сценаріїв NPM та JS, що охоплюють весь процес збирання та розгортання. Ви можете знайти ці сценарії NPM у package.jsonкореневій папці, у властивості з назвою scripts. Там ви в основному будете стикатися з такими командами babel-node tools/run start. Babel-вузол - це інструмент CLI (не призначений для використання у виробництві), який спочатку компілює файл tools/runES6 (файл run.js, розміщений в інструментах ) - в основному утиліта runner. Цей бігун приймає функцію як аргумент і виконує її, що в даному випадку є start- ще одна утиліта (start.js) відповідальний за поєднання вихідних файлів (як клієнтських, так і серверних) та запуск сервера додатків та розробок (сервер розробок, мабуть, або Webpack Dev Server, або Browsersync).

Якщо говорити точніше, start.jsстворює як клієнтські, так і серверні пакети, запускає експрес-сервер і після успішного запуску ініціалізує браузер-синхронізацію, яка на момент написання виглядала так (зверніться до реакції стартового проекту на найновіший код).

const bs = Browsersync.create();  
bs.init({
      ...(DEBUG ? {} : { notify: false, ui: false }),

      proxy: {
        target: host,
        middleware: [wpMiddleware, ...hotMiddlewares],
      },

      // no need to watch '*.js' here, webpack will take care of it for us,
      // including full page reloads if HMR won't work
      files: ['build/content/**/*.*'],
}, resolve)

Важлива частина полягає в тому proxy.target, де вони встановлюють адресу сервера, яку вони хочуть проксі, який може бути http: // localhost: 3000 , і Browsersync запускає сервер, прослуховуючи на http: // localhost: 3001 , де створені активи подаються з автоматичною зміною виявлення та заміна гарячого модуля. Як бачите, є ще одна властивість конфігурації filesз окремими файлами або шаблонами Browser-sync спостерігає за змінами та перезавантаженням браузера, якщо такі відбуваються, але, як йдеться в коментарі, Webpack піклується про перегляд js-джерел самостійно з HMR, тому вони співпрацюють там.

Тепер у мене немає еквівалентного прикладу такої конфігурації Grunt або Gulp, але з Gulp (і дещо подібним чином з Grunt) ви писали б окремі завдання в gulpfile.js, як

gulp.task('bundle', function() {
  // bundling source files with some gulp plugins like gulp-webpack maybe
});

gulp.task('start', function() {
  // starting server and stuff
});

де ви б робили по суті майже ті ж речі, що і в комплекті для початківців, на цей раз із завданням, який вирішує деякі проблеми для вас, але представляє свої проблеми та деякі труднощі під час вивчення використання, і, як я кажу, чим більше у вас залежностей, тим більше може піти не так. І саме тому я люблю позбуватися таких інструментів.


3
чудова відповідь! Чи можете ви описати pls, яким способом вебпакет / перегляд веб-модулів керувати модулями вузлів повторного використання у веб-переглядачі?
VB_

4
Вебпак збирає залежності (експортовані значення модуля) в об'єкт (встановлені модулі). Тому кожен модуль є властивістю цього об'єкта, а ім'я такого властивості є його ідентифікатором (наприклад, 1, 2, 3 ... і т.д.). Кожен раз, коли вам потрібен такий модуль у своєму джерелі, webpack перетворює значення у виклик функції з ідентифікатором модуля в аргументі (наприклад, __webpack_require __ (1)), який повертає потрібну залежність на основі пошуку в встановлених модулях за ідентифікатором модуля. Я не впевнений, як Browrify справляється з цим.
Дан Мадак

@Dan Skočdopole Чи можете ви детальніше розробити?
Асим КТ

1
Я не згоден з представленням базового використання gulp або grunt, ці два легко порівняти, використовуючи google, webpack-dev-сервер вимагає спершу зрозуміти webpack, і це виходить за рамки цього питання / відповіді, але я представив деякі конфігурації браузера. Ви маєте рацію зі стартовим набором, і я детальніше розповів про це.
Dan Macák

5
+1 для зменшення залежностей, щоб зробити речі простішими, а не слідувати (більш) популярній думці, що кожен новий пакет повинен використовуватися!
madannes

675

Оновлення жовтня 2018 року

Якщо ви все ще не впевнені у розробці Front-end, можете швидко перейти до чудового ресурсу.

https://github.com/kamranahmedse/developer-roadmap

Оновлення червня 2018 року

Вивчити сучасний JavaScript важко, якщо ви там не були з самого початку. Якщо ви новачок, не забудьте перевірити цей чудовий текст, щоб мати кращий огляд.

https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70

Оновлення липня 2017 року

Нещодавно я знайшов по-справжньому посібник від команди Grab про те, як наблизитись до передового розвитку в 2017 році. Ви можете перевірити це як нижче.

https://github.com/grab/front-end-guide


Я також шукав це досить довгий час, оскільки є багато інструментів там, і кожен з них приносить нам користь в іншому аспекті. Спільнота поділена на такі інструменти, як Browserify, Webpack, jspm, Grunt and Gulp. Ви також можете почути про це Yeoman or Slush. Це насправді не проблема, це просто заплутано для всіх, хто намагається зрозуміти чіткий шлях вперед.

У будь-якому разі, я хотів би щось внести в свій внесок.

1. Менеджер пакетів

Менеджери пакунків спрощують встановлення та оновлення залежностей проекту, що є бібліотеками, такими як: jQuery, Bootstrapі т. Д. - все, що використовується на вашому сайті і не написане вами.

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

  • NPMрозшифровується як: Node JS package managerдопомагає керувати всіма бібліотеками, на які покладається програмне забезпечення. Ви б визначили свої потреби у файлі, який називається package.jsonта запущений npm installу командному рядку ... потім BANG, ваші пакунки завантажуються та готові до використання. Може використовуватися як для front-end and back-endбібліотек.

  • Bower: для управління пакетними пакетами концепція збігається з NPM. Усі ваші бібліотеки зберігаються у файлі з назвою, bower.jsonа потім запускаються bower installв командному рядку.

Найбільша різниця між Bowerі NPMполягає в тому, що NPM робить вкладене дерево залежності, тоді як Bower вимагає дерева плоскої залежності, як показано нижче.

Цитуючи з Яка різниця між Бауер і НПМ?

НПМ

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

Бауер

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

Є деякі оновлення npm 3 Duplication and Deduplication, будь ласка, відкрийте документ для отримання більш детальної інформації.

  • Yarn: Новий менеджер пакетів для JavaScript опублікованого на Facebookнедавно ще з деякими перевагами по порівнянні з NPM. І з пряжею ви все одно можете використовувати NPMі Bowerреєстр, і отримати пакет. Якщо ви встановили пакет раніше, yarnстворюється кешована копія, що полегшує offline package installs.

  • jspm: - менеджер пакетів для SystemJSуніверсального завантажувача модулів, побудованого поверх динамічного ES6завантажувача модулів. Це не зовсім новий менеджер пакунків із власним набором правил, скоріше він працює над існуючими джерелами пакунків. З коробки він працює з GitHubі npm. Оскільки Bowerзаснована більшість пакетів GitHub, ми також можемо встановити ці пакети jspm. У ньому є реєстр, в якому перераховано більшість часто використовуваних фронтальних пакетів для легшої установки.

Дивіться різницю між Bowerта jspm: Менеджер пакунків: Bower vs jspm


2. Навантажувач / зшивання модулів

У більшості проектів будь-якого масштабу код буде розділений між кількома файлами. Ви можете просто включити кожен файл окремим <script>тегом, проте <script>встановлює нове http-з'єднання, а для невеликих файлів - що є метою модульності - час на встановлення з'єднання може зайняти значно більше часу, ніж передача даних. Поки сценарії завантажуються, жоден контент не може бути змінений на сторінці.

  • Проблему часу завантаження можна значною мірою вирішити шляхом об'єднання групи простих модулів в один файл та мінімізації.

Напр

<head>
    <title>Wagon</title>
    <script src=“build/wagon-bundle.js”></script>
</head>
  • Продуктивність приходить за рахунок гнучкості. Якщо ваші модулі мають взаємозалежність, ця відсутність гнучкості може стати покажчиком.

Напр

<head>
    <title>Skateboard</title>
    <script src=“connectors/axle.js”></script>
    <script src=“frames/board.js”></script>
    <!-- skateboard-wheel and ball-bearing both depend on abstract-rolling-thing -->
    <script src=“rolling-things/abstract-rolling-thing.js”></script>
    <script src=“rolling-things/wheels/skateboard-wheel.js”></script>
    <!-- but if skateboard-wheel also depends on ball-bearing -->
    <!-- then having this script tag here could cause a problem -->
    <script src=“rolling-things/ball-bearing.js”></script>
    <!-- connect wheels to axle and axle to frame -->
    <script src=“vehicles/skateboard/our-sk8bd-init.js”></script>
</head>

Комп'ютери можуть зробити це краще, ніж ви можете, і саме тому вам слід скористатися інструментом для автоматичного поєднання всього в один файл.

Потім ми почули про RequireJS, Browserify, WebpackіSystemJS

  • RequireJS: - завантажувач JavaScriptфайлів і модулів. Він оптимізований для використання в браузері, але його можна використовувати в інших середовищах JavaScript, наприклад Node.

Напр .: myModule.js

// package/lib is a dependency we require
define(["package/lib"], function (lib) {

    // behavior for our module
    function foo() {
        lib.log( "hello world!" );
    }

    // export (expose) foo to other modules as foobar
    return {
        foobar: foo
    }
});

У main.js, ми можемо імпортувати myModule.jsяк залежність і використовувати її.

require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

І тоді в нашому HTML, ми можемо звернутися до використання з RequireJS.

<script src=“app/require.js data-main=“main.js ></script>

Читайте докладніше CommonJSта AMDлегко зрозумійте. Зв'язок між CommonJS, AMD та RequireJS?

  • Browserify: встановлено, щоб дозволити використання CommonJSвідформатованих модулів у браузері. Отже, Browserifyце не стільки завантажувач модулів, скільки пакет модулів: Browserifyце цілком інструмент нарощування часу, що створює пакет коду, який потім може бути завантажений на стороні клієнта.

Почніть з машини побудови, на якій встановлений вузол і npm, і отримайте пакет:

npm install -g save-dev browserify

Напишіть свої модулі у CommonJSформаті

//entry-point.js
var foo = require('../foo.js');
console.log(foo(4));

І коли щасливий, видайте команду для зв’язку:

browserify entry-point.js -o bundle-name.js

Рециркуляція рекурсивно знаходить усі залежності точки входу та збирає їх в один файл:

<script src=”bundle-name.js”></script>
  • Webpack: Він об'єднує всі ваші статичні активи, включаючи JavaScriptзображення, CSS та багато іншого, в один файл. Це також дозволяє обробляти файли через різні типи завантажувачів. Ви можете написати JavaScriptз CommonJSабо AMDмодулі синтаксису. Він атакує проблему побудови принципово більш інтегрованим та висловлюваним способом. У Browserifyвикористанні Gulp/Gruntі довгий список перетворень і плагінів , щоб отримати роботу. Webpackпропонує достатньо енергії з коробки, яка вам зазвичай не потрібна Gruntабо взагалі не потрібна Gulp.

Базове використання не просто. Встановіть Webpack, як Browserify:

npm install -g save-dev webpack

І передайте команді точку входу та вихідний файл:

webpack ./entry-point.js bundle-name.js
  • SystemJS: - завантажувач модулів, який може імпортувати модулі під час виконання будь-якого популярного сьогодні формату ( CommonJS, UMD, AMD, ES6). Він побудований поверх ES6поліфазного навантажувача модулів і досить розумний, щоб виявити використовуваний формат і обробляти його належним чином. SystemJSтакож можна транслірувати код ES6 (з Babelабо Traceur) або іншими мовами, такими як TypeScriptі CoffeeScriptза допомогою плагінів.

Хочете дізнатися, що таке node moduleі чому він недостатньо адаптований до браузера.

Більш корисна стаття:


Чому jspmі SystemJS?

Однією з головних цілей ES6модульности, щоб зробити його дуже просто встановити і використовувати будь-яку бібліотеку Javascript з будь-якої точки інтернету ( Github, npmі т.д.). Потрібно лише дві речі:

  • Єдина команда для встановлення бібліотеки
  • Один єдиний рядок коду для імпорту та використання бібліотеки

Так що з jspm, ви можете це зробити.

  1. Встановіть бібліотеку командою: jspm install jquery
  2. Імпортуйте бібліотеку одним рядком коду, не потрібно зовнішньої посилання всередині вас HTML-файлу.

display.js

var $ = require('jquery'); 

$('body').append("I've imported jQuery!");
  1. Потім ви налаштовуєте ці речі всередині, System.config({ ... })перш ніж імпортувати свій модуль. Зазвичай при запуску jspm initбуде файл, названий config.jsдля цієї мети.

  2. Щоб зробити ці сценарії запущеними, нам потрібно завантажити system.jsі config.jsна сторінку HTML. Після цього ми завантажимо display.jsфайл за допомогою завантажувача SystemJSмодулів.

index.html

<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
  System.import("scripts/display.js");
</script>

Помічено: Ви можете також використовувати npmз Webpackякості Кутове 2 застосував його. Оскільки він jspmбув розроблений для інтеграції SystemJSта працює над існуючим npmджерелом, тож відповідь залежить від вас.


3. Завдання бігун

Виконання завдань та інструменти побудови - це насамперед інструменти командного рядка. Чому нам потрібно їх використовувати: Одним словом: автоматизація . Менша робота, яку вам доведеться виконати при виконанні таких повторюваних завдань, як мінімізація, компіляція, тестування одиниць, зв'язування яких раніше коштувало нам багато разів, щоб виконати командний рядок або навіть вручну.

  • Grunt: Ви можете створити автоматизацію для свого середовища розробки для попереднього опрацювання кодів або створення сценаріїв побудови з конфігураційним файлом, і здається, що дуже складно впоратися зі складною задачею. Популярний в останні кілька років.

Кожне завдання Grunt- це масив різних конфігурацій плагінів, які просто виконуються одна за одною суворо незалежно та послідовно.

grunt.initConfig({
  clean: {
    src: ['build/app.js', 'build/vendor.js']
  },

  copy: {
    files: [{
      src: 'build/app.js',
      dest: 'build/dist/app.js'
    }]
  }

  concat: {
    'build/app.js': ['build/vendors.js', 'build/app.js']
  }

  // ... other task configurations ...

});

grunt.registerTask('build', ['clean', 'bower', 'browserify', 'concat', 'copy']);
  • Gulp: Автоматизація так само, Gruntале замість конфігурацій, ви можете писати JavaScriptпотоками на зразок вузлової програми. Віддавайте перевагу цим дням.

Це Gulpзразок декларації завдання.

//import the necessary gulp plugins
var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCss = require('gulp-minify-css');
var rename = require('gulp-rename');

//declare the task
gulp.task('sass', function(done) {
  gulp.src('./scss/ionic.app.scss')
    .pipe(sass())
    .pipe(gulp.dest('./www/css/'))
    .pipe(minifyCss({
      keepSpecialComments: 0
    }))
    .pipe(rename({ extname: '.min.css' }))
    .pipe(gulp.dest('./www/css/'))
    .on('end', done);
});

Дивіться більше: https://medium.com/@preslavrachev/gulp-vs-grunt-why-one-why-the-other-f5d3b398edc4#.fte0nahri


4. Інструменти для будівельних лісів

  • Slush and Yeoman: Ви можете створювати початкові проекти з ними. Наприклад, ви плануєте побудувати прототип з HTML і SCSS, а потім замість того, щоб вручну створити якусь папку, наприклад scss, css, img, шрифти. Ви можете просто встановити yeomanі запустити простий скрипт. Тоді все тут для вас.

Знайдіть більше тут .

npm install -g yo
npm install --global generator-h5bp
yo h5bp

Дивіться більше: https://www.quora.com/What-are-the-differences-bet between-NPM-Bower-Grunt-Gulp-Webpack-Browserify-Slush-Yeoman-and-Express


Моя відповідь насправді не відповідає змісту питання, але коли я шукаю ці знання в Google, я завжди бачу це питання вгорі, так що я вирішив відповісти на нього підсумково. Сподіваюся, хлопці вважають це корисним.


64

Гаразд, всі вони мають певну схожість, вони роблять однакові речі для вас різними і подібними способами, я поділяю їх на 3 основні групи, як нижче:


1) Побутові модулі

Вебпак та перегляньте як популярні, працюйте як бігуни завдань, але з більшою гнучкістю, а також він з’єднає все разом як ваше налаштування, тому ви можете вказати на результат як bundle.js, наприклад, в одному файлі, включаючи CSS та Javascript, для Більш детальну інформацію про кожну дивіться нижче:

вебпакет

webpack - це модульний пакет для сучасних програм JavaScript. Коли webpack обробляє вашу програму, він рекурсивно створює графік залежності, який включає кожен модуль, який потрібна вашій програмі, а потім пакує всі ці модулі в невелику кількість пакетів - часто лише один - для завантаження браузером.

Це неймовірно настроюється, але для початку вам потрібно лише зрозуміти чотири основні поняття: запис, вихід, завантажувачі та плагіни.

Цей документ покликаний дати огляд цих концепцій на високому рівні, надаючи при цьому посилання на детальні конкретні випадки використання концепції.

більше тут

перегляньте

Browserify - це інструмент розробки, який дозволяє нам писати модулі стилю node.js, які збираються для використання у браузері. Так само, як і вузол, ми пишемо наші модулі в окремі файли, експортуючи зовнішні методи та властивості, використовуючи module.exports та експортуючи змінні. Ми навіть можемо вимагати інших модулів, використовуючи функцію вимагати, і якщо ми опустимо відносний шлях, він вирішиться до модуля в каталозі node_modules.

більше тут


2) Завдання бігунів

gulp і grunt - це запуски завдань, в основному те, що вони роблять, створюючи завдання та запускаючи їх коли завгодно, наприклад, ви встановлюєте плагін, щоб мінімізувати свій CSS, а потім запускаєте його кожен раз, щоб зробити мінімізацію, більше деталей про кожного:

ковтати

gulp.js - це інструментарій JavaScript з відкритим кодом від Fractal Innovations та спільнотою з відкритим кодом у GitHub, що використовується як система потокового складання в розробці веб-сторінок. Це запуск завдань, побудований на Node.js та Node Package Manager (npm), який використовується для автоматизації трудомістких та повторюваних завдань, що беруть участь у веб-розробці, такі як мінімізація, конкатенація, перетворення кеш-пам'яті, тестування блоків, підключення, оптимізація та ін. підхід до конфігурації коду для визначення своїх завдань і для їх виконання покладається на невеликі, одноцільові плагіни. gulp ecosystem має 1000+ таких плагінів, доступних на вибір.

більше тут

бурчить

Grunt - це запуск завдань JavaScript, інструмент, який використовується для автоматичного виконання часто використовуваних завдань, таких як мінімізація, компіляція, тестування блоків, зв'язування тощо. Він використовує інтерфейс командного рядка для запуску спеціальних завдань, визначених у файлі (відомий як Gruntfile) . Грунт був створений Бен Алманом і написаний в Node.js. Він поширюється через npm. В даний час в екосистемі Grunt доступно більше п'яти тисяч плагінів.

більше тут


3) Менеджери пакетів

менеджери пакетів - це те, що вони керують необхідними плагінами у вашій програмі та встановлюють їх через github тощо за допомогою пакета.json, що дуже зручно для оновлення модулів, встановлення їх та обміну вашим додатком. Більше деталей для кожного:

п / хв

npm - менеджер пакунків для мови програмування JavaScript. Це менеджер пакунків за замовчуванням для середовища виконання JavaScript Node.js. Він складається з клієнта командного рядка, який також називається npm, та інтернет-бази даних публічних пакетів, що називається реєстром npm. Доступ до реєстру здійснюється через клієнта, а доступні пакети можна переглядати та шукати через веб-сайт npm.

більше тут

бауер

Bower може керувати компонентами, що містять HTML, CSS, JavaScript, шрифти або навіть файли зображень. Bower не об'єднує і не змінює код або робить щось інше - він просто встановлює потрібні версії необхідних пакетів та їх залежність. Для початку компанія Bower працює, отримуючи та встановлюючи пакети з усіх куточків, дбаючи про полювання, пошук, завантаження та збереження потрібних вами речей. Bower відстежує ці пакети у файлі маніфесту, bower.json.

більше тут

і найновіший менеджер пакунків, який не слід пропускати, він молодий і швидкий в реальній робочій середовищі порівняно з npm, який я в основному використовував раніше, для перевстановлення модулів, він подвійно перевіряє папку node_modules, щоб перевірити існування модуля, також здається, що встановлення модулів займає менше часу:

пряжа

Пряжа - це менеджер пакунків для вашого коду. Це дозволяє використовувати та ділитися кодом з іншими розробниками з усього світу. Пряжа робить це швидко, надійно і надійно, так що вам ніколи не доведеться турбуватися.

Пряжа дозволяє використовувати рішення інших розробників для різних проблем, полегшуючи розробку програмного забезпечення. Якщо у вас є проблеми, ви можете повідомити про проблеми або внести свої внески, і коли проблему виправлено, ви можете використовувати Пряжу, щоб постійно оновити її.

Код поділяється через щось, що називається пакетом (іноді його називають модулем). Пакет містить весь код, який надається спільним, а також файл package.json, який описує пакет.

більше тут



Чи є список плагінів gulp? чи справді 1000+? npm повертає лише 20 або близько того?
flurbius

1
Чудовий підсумок. Повинно бути вхідною точкою для будь-якої дискусії про сучасну веб-розробку.
Адам Бубела

1
@flurbius Так, тут: gulpjs.com/plugins . В даний час, здається, є 3,465 плагінів Gulp.
mts knn

52

Ви можете знайти технічне порівняння на npmcompare

Порівнюючи браузерний та грунтовний порівняно із глотком та вебпакетом

Як бачите, веб-пакет дуже добре підтримується, коли нова версія виходить в середньому кожні 4 дні. Але у Gulp, здається, є найбільша спільнота з усіх (із 20-зірковими зірками на Github). Grunt здається трохи занедбаним (порівняно з іншими)

Тож, якщо потрібно вибрати один за іншим, я б поїхав із Гулпом


5
webpack тепер на 26k стартує на Github і gulp з 25.7k. Неможливо використовувати коефіцієнт популярності, щоб вирішити більше ...
Rayee Roded


14

Що таке webpack & webpack-dev-сервер? В офіційній документації йдеться про модульний пакет, але для мене це лише виконавець завдань. Яка різниця?

webpack-dev-сервер - це веб-сервер для перезавантаження в реальному часі, що Webpack розробники використовують для негайного відгуку про те, що вони роблять. Його слід використовувати лише під час розробки.

Цей проект сильно натхненний nof5 інструментом тестування .

Вебпак, як випливає з назви, створить єдиний вік пакету для Інтернету . Пакет буде мінімізовано та об'єднано в один файл (ми все ще живемо у HTTP 1.1 віці). Webpack магія поєднувати ресурси (JavaScript, CSS, зображення) та вводити їх таким чином:<script src="assets/bundle.js"></script> .

Його також можна назвати пакетом модулів, тому що він повинен розуміти залежність модуля, а також як захопити залежності та зв'язати їх разом.

Де ви б використовували перегляд веб-сторінок? Чи не можемо ми зробити те ж саме з імпортом вузла / ES6?

Ви можете використовувати Browrify для тих самих завдань, де ви б використовували Webpack . - Вебпак Хоча є більш компактним.

Зауважте, що функції завантажувача модулів ES6 у Webpack2 використовують System.import , який не підтримує жоден веб-переглядач.

Коли ви використовуєте gulp / grunt за npm + плагіни?

Ви можете забути Gulp, Grunt, Brokoli, Brunch та Bower . Замість цього скористайтеся сценаріями командного рядка npm замість цього, і ви можете усунути додаткові пакети, такі як тут, для Gulp :

var gulp        = require('gulp'),
  minifyCSS     = require('gulp-minify-css'),
  sass          = require('gulp-sass'),
  browserify    = require('gulp-browserify'),
  uglify        = require('gulp-uglify'),
  rename        = require('gulp-rename'),
  jshint        = require('gulp-jshint'),
  jshintStyle   = require('jshint-stylish'),
  replace       = require('gulp-replace'),
  notify        = require('gulp-notify'),

Можливо, ви можете використовувати генератори конфігураційних файлів Gulp та Grunt при створенні конфігураційних файлів для свого проекту. Таким чином вам не потрібно встановлювати Yeoman або подібні інструменти.


14

Пряжа - недавній менеджер пакунків, який, напевно, заслуговує на згадку.
Отже, ось це: https://yarnpkg.com/

Наскільки я знаю, він може отримати як npm, так і bower залежність, і має інші цінні функції.


12

Webpackє розмножувачем. Так, як Browserfyце виглядає в кодовій базі запитів модулів ( requireабо import) і вирішує їх рекурсивно. Більше того, ви можете налаштувати Webpackвирішення не тільки JavaScript-подібних модулів, але CSS, зображень, HTML, буквально всього. Що особливо мене хвилює Webpack, ви можете комбінувати як складені, так і динамічно завантажені модулі в одному додатку. Таким чином, можна отримати реальне підвищення продуктивності, особливо через HTTP / 1.x. Як саме ви це робите, я описав з прикладами тут http://dsheiko.com/weblog/state-of-javascript-modules-2017/ Як альтернативу для постачальника можна подумати Rollup.js( https://rollupjs.org/ ) , що оптимізує код під час компіляції, але знімаючи всі знайдені невикористані фрагменти.

Бо AMDзамість RequireJSодного можна перейти з рідним ES2016 module system, але завантаженим System.js( https://github.com/systemjs/systemjs )

Крім того, я зазначу, що npmчасто використовується як автоматизований інструмент, як gruntабо gulp. Перевірте https://docs.npmjs.com/misc/scripts . Я особисто переходжу до сценаріїв npm лише уникаючи інших інструментів автоматизації, хоча в минулому я дуже сильно запускався grunt. За допомогою інших інструментів вам доводиться покладатися на незліченну кількість плагінів для пакетів, які часто не добре пишуться і не підтримуються активно. npmзнає свої пакети, тому ви зателефонуєте до будь-якого з локально встановлених пакетів на ім'я, наприклад:

{
  "scripts": {
    "start": "npm http-server"
  },
  "devDependencies": {
    "http-server": "^0.10.0"
  }
}

Насправді вам, як правило, не потрібен плагін, якщо пакет підтримує CLI.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.