NPM против Bower против Browserify против Gulp против Grunt против Webpack

Я пытаюсь обобщить свои знания о наиболее популярных менеджерах пакетов JavaScript, сборщиках пакетов и средствах выполнения задач. Пожалуйста, поправьте меня, если я ошибаюсь:

  • npm & bower - менеджеры пакетов. Они просто скачивают зависимости и не знают, как создавать проекты самостоятельно. Они знают, что нужно вызвать _3 _ / _ 4 _ / _ 5_ после получения всех зависимостей.
  • bower похож на npm, но строит плоские деревья зависимостей (в отличие от npm, который делает это рекурсивно). Это означает, что npm извлекает зависимости для каждой зависимости (может извлекать одно и то же несколько раз), в то время как bower ожидает, что вы вручную включите подчиненные зависимости. Иногда bower и npm используются вместе для внешнего и внутреннего интерфейса соответственно (поскольку каждый мегабайт может иметь значение для внешнего интерфейса).
  • grunt и gulp - это средства выполнения задач для автоматизации всего, что можно автоматизировать (т. Е. Компиляции CSS / Sass, оптимизации изображений, создания пакета и его минимизации / транспиляции).
  • grunt против gulp (похоже на maven против gradle или конфигурацию против кода). Grunt основан на настройке отдельных независимых задач, каждая задача открывает / обрабатывает / закрывает файл. Gulp требует меньше кода и основан на потоках Node, что позволяет ему строить цепочки конвейеров (без повторного открытия того же файла) и делает его быстрее.
  • webpack (webpack-dev-server) - для меня это таск-раннер с горячей перезагрузкой изменений, позволяющий забыть обо всех наблюдателях JS / CSS.
  • _21 _ / _ 22_ + плагины могут заменить исполнителей задач. Их возможности часто пересекаются, поэтому есть разные последствия, если вам нужно использовать _23 _ / _ 24_ вместо npm + плагинов. Но исполнители задач определенно лучше подходят для сложных задач (например, «при каждой сборке создавать пакет, переносить с ES6 на ES5, запускать его во всех эмуляторах браузеров, делать снимки экрана и развертывать в Dropbox через ftp»).
  • browserify позволяет упаковывать модули узлов для браузеров. browserify против node require на самом деле AMD против CommonJS.

Вопросы:

  1. Что такое webpack & webpack-dev-server? Официальная документация говорит, что это сборщик модулей, но для меня это просто средство выполнения задач. В чем разница?
  2. Где бы вы использовали browserify? Разве мы не можем сделать то же самое с импортом узлов / ES6?
  3. Когда бы вы использовали _33 _ / _ 34_ вместо npm + плагинов?
  4. Приведите примеры, когда вам нужно использовать комбинацию

person VB_    schedule 28.01.2016    source источник
comment
пора добавить в накопительный пакет? ????   -  person gman    schedule 25.08.2016
comment
это очень разумный вопрос. псевдо веб-разработчики вроде меня натыкаются на все пакеты, которые реализуются еженедельно ..   -  person Simon Dirmeier    schedule 10.09.2016
comment
hackernoon.com/   -  person Fisherman    schedule 17.10.2016
comment
@Fisherman Я совершенно новичок в этом, и это кажется совершенно чокнутым ...   -  person David Stosik    schedule 17.10.2016
comment
@DavidStosik может быть вы пропустили обнадеживающие части в комментариях :)   -  person Fisherman    schedule 17.10.2016
comment
@Fisherman Рекомендуемый комментарий, который я только что прочитал, был еще хуже! D: Я просто хочу создать чертовски статичную страницу, которая использует пару библиотек CSS / JS, и мне было бы полезно иметь инструмент, который может скомпилировать их вместе ... Добавьте какой-нибудь шаблонизатор, чтобы дать немного отдохнуть моему Ctrl-C / Ctrl-V пальцы, и это было бы идеально ... И все же, спустя несколько часов, все еще пытаюсь найти выход ...   -  person David Stosik    schedule 17.10.2016
comment
@DavidStosik: это одноразовое вложение. после идеальной настройки вы готовы к полету   -  person Fisherman    schedule 17.10.2016
comment
@gman, jspm, который тоже использует свертку.   -  person sites    schedule 03.12.2016
comment
Я был веб-разработчиком более 16 лет, и большая часть этого была под эгидой Microsoft .NET, где они на долгие годы укрывали нас от подобных инструментов, прежде чем обрушить на нас ад, внезапно охладившись всем сразу (даже если их IDE не сможет с этим справиться [я слышал, что vs2017 лучше, но сейчас я буду придерживаться WebStorm {Digresption}]). Как бы то ни было, эти вещи усложняют инфраструктуру разработки и требуют гораздо больше времени на первоначальную настройку, чтобы сделать все правильно, но как только она установлена ​​и заработает, это мило!   -  person Adam Plocher    schedule 24.03.2017
comment
Пора добавить пряжу (yarnpkg.com)?   -  person Agu Dondo    schedule 03.05.2017
comment
@Fisherman кажется несколько наивным, полагая, что это действительно будет `` одноразовое вложение '' ... после нескольких лет работы с технологиями, мотивация изучать эти уровни посторонних сложностей для меня значительно уменьшилась из-за горького опыта. это, казалось, работало хорошо, будучи устаревшим. Такие модные веб-технологии имеют неприятный запах от этой точки зрения (а я даже не старый).   -  person PeterT    schedule 31.01.2019
comment
Думаю, вам стоит добавить в список и Вавилон.   -  person Nilesh Pawar    schedule 20.06.2019
comment
Npm вообще ничего не знает о webpack / gulp / grunt. Он просто знает, как устанавливать ваши зависимости, запускать ваше приложение и ваши тесты. Однако вы можете добавить некоторые дополнительные функции, добавив собственные скрипты.   -  person Diogo Eichert    schedule 21.02.2020
comment
Добро пожаловать в кроличью нору.   -  person carloswm85    schedule 16.12.2020
comment
Это примерный детский вопрос, требующий большего внимания ???? Есть 6 вопросов, которые задаются напрямую, и еще около 10 задаются косвенно, так ли это?   -  person gman    schedule 03.02.2021


Ответы (7)


Webpack и Browserify

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

Например, предположим, что вы написали код ES6, разделенный на модули, и хотите иметь возможность запускать его в браузере. Если эти модули являются модулями Node, браузер их не поймет, поскольку они существуют только в среде Node. Модули ES6 также не будут работать в старых браузерах, таких как IE11. Более того, вы могли использовать экспериментальные языковые функции (следующие предложения ES), которые браузеры еще не реализуют, поэтому запуск такого сценария просто вызовет ошибки. Такие инструменты, как Webpack и Browserify, решают эти проблемы, переводя такой код в форму, которую может выполнить браузер. Кроме того, они позволяют применять к этим пакетам огромное количество разнообразных оптимизаций.

Однако Webpack и Browserify во многом различаются, Webpack по умолчанию предлагает множество инструментов (например, разделение кода), а Browserify может сделать это только после загрузки плагинов, но использование обоих приводит к очень похожим результатам. Все сводится к личным предпочтениям (Webpack более модный). Кстати, Webpack - это не средство выполнения задач, это просто обработчик ваших файлов (он обрабатывает их так называемыми загрузчиками и плагинами), и он может быть запущен (среди других способов) средством запуска задач.


Сервер разработки Webpack

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-node - это инструмент командной строки (не предназначенный для производственного использования), который сначала компилирует файл ES6 tools/run (файл run.js, расположенный в tools) - в основном служебная программа-бегун. Этот бегун принимает функцию в качестве аргумента и выполняет ее, в данном случае это 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
});

где вы будете делать в основном те же вещи, что и в стартовом наборе, на этот раз с помощью Task Runner, который решает некоторые проблемы за вас, но представляет свои собственные проблемы и некоторые трудности во время изучения использования, и, как я уже сказал, чем больше у вас зависимостей, тем больше может пойти не так. Вот почему мне нравится избавляться от таких инструментов.

person Dan Macák    schedule 28.01.2016
comment
отличный ответ! Не могли бы вы описать, пожалуйста, каким образом webpack / browserify управляет модулями повторного использования узлов в браузере? - person VB_; 28.01.2016
comment
Webpack собирает зависимости (экспортированные значения модулей) в объект (installedModules). Таким образом, каждый модуль является свойством этого объекта, а имя такого свойства представляет его идентификатор (например, 1, 2, 3 ... и т. Д.). Каждый раз, когда вам требуется такой модуль в исходном коде, webpack преобразует значение в вызов функции с идентификатором модуля в аргументе (например, __webpack_require __ (1)), который возвращает правильную зависимость на основе поиска в установленных модулях по идентификатору модуля. Я не уверен, как Browserify с этим справляется. - person Dan Macák; 28.01.2016
comment
@Dan Skočdopole Не могли бы вы рассказать подробнее? - person Asim K T; 10.09.2016
comment
По какому вопросу вы хотите, чтобы я подробнее остановился? - person Dan Macák; 10.09.2016
comment
Не могли бы вы добавить примеры? Например, кратчайший код для использования webpack-dev-server и Browsersync для запуска сервера, примеры задач в grunt и gulp и т. Д. И перемещение примеров начального проекта реакции на сам ответ также будет полезно, поскольку репо может изменить код в будущем. (Или ссылку на точный снимок репо) - person Asim K T; 10.09.2016
comment
Я не согласен с описанием базового использования gulp или grunt, эти два легко сравнить с помощью google, webpack-dev-server требует, чтобы сначала понять webpack, и это выходит за рамки этого вопроса / ответа, но я представил некоторая конфигурация Browsersync. Вы правы со стартовым набором, и я подробно остановился на нем. - person Dan Macák; 10.09.2016
comment
+1 за сокращение зависимостей, чтобы все было просто, а не следование (более) популярному мнению, что каждый новый пакет должен использоваться! - person madannes; 26.01.2017
comment
Очень хорошо, но у меня вопрос, какова связь между node_module и webpack? ِ Есть ли у webpack сам загрузчик? Или мы должны загрузить загрузчики, а затем wepback использует их? - person Ali Abbaszade; 13.12.2018
comment
@AliAbbaszade node_modules - это папка, в которую npm или yarn устанавливают зависимости. Веб-пакет является такой зависимостью, как и загрузчики, используемые веб-пакетом. Не уверен, есть ли в webpack загрузчики по умолчанию, но в пакете webpack есть плагины, которые вы можете использовать. Так что да, вам нужно скачать загрузчики отдельно и объявить их в конфигурации webpack, чтобы вы могли их использовать. - person Dan Macák; 13.12.2018
comment
Привет, братан, я вижу, у тебя выдающиеся познания в webpack. Не могли бы ты помочь мне в моей теме stackoverflow.com/questions/60030506/ - person The Dead Man; 06.02.2020

Обновление, октябрь 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. Package Manager
    • NPM
    • Беседка
    • Разница между Bower и NPM
    • Пряжа
    • jspm
  • 2. Module Loader/Bundling
    • RequireJS
    • Просматривать
    • Webpack
    • SystemJS
  • 3. Task runner
    • Grunt
    • Глоток
  • 4. Scaffolding tools
    • Slush and Yeoman

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

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

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

NPM

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

Бауэр

Для внешнего управления пакетами концепция та же, что и у NPM. Все ваши библиотеки хранятся в файле с именем bower.json, а затем запускайте bower install в командной строке.

Пользователям Bower рекомендуется перейти на npm или yarn . Пожалуйста, будь осторожен

Разница между Bower и NPM

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

Цитата из В чем разница между Bower и npm?

NPM

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

Bower

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. Чтобы получить более подробную информацию, откройте документ.

Пряжа

Новый менеджер пакетов для JavaScript , недавно опубликованный Facebook, с некоторыми дополнительными преимуществами по сравнению с NPM. А с Yarn вы по-прежнему можете использовать как NPM, так и _ 23_, чтобы получить пакет. Если вы установили пакет раньше, yarn создаст кешированную копию, что упрощает offline package installs.

jspm

JSPM - это менеджер пакетов для SystemJS универсального загрузчика модулей, построенный на основе динамического ES6 загрузчика модулей. Это не совсем новый менеджер пакетов со своим собственным набором правил, скорее он работает поверх существующих источников пакетов. Из коробки работает с GitHub и npm. Поскольку большинство пакетов на основе Bower основаны на GitHub, мы также можем установить эти пакеты, используя jspm. В нем есть реестр, в котором перечислены наиболее часто используемые клиентские пакеты для упрощения установки.

Посмотрите разницу между Bower и jspm: Менеджер пакетов: Bower vs jspm


2. Загрузчик модулей / комплектация

Код большинства проектов любого масштаба будет разделен на несколько файлов. Вы можете просто включить каждый файл с отдельным тегом <script>, однако <script> устанавливает новое HTTP-соединение, а для небольших файлов - что является целью модульности - время для установки соединения может занять значительно больше времени, чем передача данных. Пока скрипты загружаются, на странице нельзя изменить содержимое.

  • Проблема времени загрузки в значительной степени может быть решена путем объединения группы простых модулей в один файл и его минимизации.

E.g

<head>
    <title>Wagon</title>
    <script src=“build/wagon-bundle.js”></script>
</head>
  • Однако производительность достигается за счет гибкости. Если ваши модули взаимозависимы, отсутствие гибкости может стать препятствием.

E.g

<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 - это полностью инструмент времени сборки, производящий пакет кода, который затем может быть загружен на стороне клиента.

Начните с машины сборки, на которой установлен node & 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

Browserify рекурсивно находит все зависимости точки входа и собирает их в один файл:

<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, поскольку Angular 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://preslav.me/2015/01/06/gulp-vs-grunt-why-one-why-the-other/


4. Инструменты для строительных лесов

Слаш и Йомен

Вы можете создавать с ними стартовые проекты. Например, вы планируете создать прототип с HTML и SCSS, а затем вместо того, чтобы вручную создавать какую-то папку, такую ​​как scss, css, img, fonts. Вы можете просто установить yeoman и запустить простой скрипт. Тогда все здесь для вас.

Дополнительные сведения см. здесь.

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

Подробнее: https://www.quora.com/What-are-the-differences-between-NPM-Bower-Grunt-Gulp-Webpack-Browserify-Slush-Yeoman-and-Express


Мой ответ не совпадает с содержанием вопроса, но когда я ищу эту информацию в Google, я всегда вижу вопрос вверху, поэтому я решил ответить на него вкратце. Надеюсь, вы сочли это полезным.

Если вам понравился этот пост, вы можете прочитать больше в моем блоге по адресу trungk18.com. Спасибо за визит :)

person trungk18    schedule 03.10.2016

Хорошо, все они имеют некоторое сходство, они делают для вас одни и те же вещи разными и похожими способами, я делю их на 3 основные группы, как показано ниже:


< strong> 1) Сборщики модулей

webpack и browserify как популярные, работают как бегуны задач, но с большей гибкостью, также он объединяет все вместе как ваши настройки, поэтому вы можете указать результат как bundle.js, например, в одном файле, включая CSS и Javascript, для более подробную информацию о каждом, посмотрите подробности ниже:

веб-пакет

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

Он невероятно настраиваемый, но для начала вам нужно только понять четыре основных концепции: ввод, вывод, загрузчики и плагины.

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

подробнее здесь

просматривать

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

подробнее здесь


2) Участники задач

gulp и grunt - это исполнители задач, в основном то, что они делают, создают задачи и запускают их, когда захотите, например, вы устанавливаете плагин для минимизации своего CSS, а затем запускаете его каждый раз для минимизации, подробнее о каждом:

глоток

gulp.js - это набор инструментов JavaScript с открытым исходным кодом от Fractal Innovations и сообщества с открытым исходным кодом на GitHub, используемый в качестве системы потоковой сборки во интерфейсной веб-разработке. Это средство выполнения задач, построенное на Node.js и Node Package Manager (npm), используемое для автоматизации трудоемких и повторяющихся задач, связанных с веб-разработкой, таких как минификация, конкатенация, очистка кеша, модульное тестирование, линтинг, оптимизация и т. Д. Gulp использует подход «код поверх конфигурации» для определения своих задач и полагается на его небольшие специализированные плагины для их выполнения. В экосистеме gulp есть более 1000 таких плагинов, доступных на выбор.

подробнее здесь

ворчание

Grunt - это средство выполнения задач JavaScript, инструмент, используемый для автоматического выполнения часто используемых задач, таких как минификация, компиляция, модульное тестирование, линтинг и т. Д. Он использует интерфейс командной строки для запуска пользовательских задач, определенных в файле (известном как Gruntfile). . Grunt был создан Беном Алманом и написан на Node.js. Распространяется через npm. В настоящее время в экосистеме Grunt доступно более пяти тысяч плагинов.

подробнее здесь


3) Менеджеры пакетов

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

npm

npm - это менеджер пакетов для языка программирования JavaScript. Это менеджер пакетов по умолчанию для среды выполнения JavaScript Node.js. Он состоит из клиента командной строки, также называемого npm, и онлайн-базы данных общедоступных пакетов, называемой реестром npm. Доступ к реестру осуществляется через клиент, а доступные пакеты можно просматривать и искать через веб-сайт npm.

подробнее здесь

беседка

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

подробнее здесь

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

пряжа

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

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

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

подробнее здесь


person Alireza    schedule 21.05.2017
comment
Есть ли список плагинов gulp? действительно ли 1000+? npm возвращает только 20 или около того? - person flurbius; 28.12.2017
comment
Отличное резюме. Должен стать отправной точкой для любого обсуждения современной веб-разработки. - person Adam Bubela; 15.02.2018
comment
@flurbius Да, здесь: gulpjs.com/plugins. В настоящее время существует 3465 подключаемых модулей Gulp. - person Matias Kinnunen; 14.03.2018
comment
А что насчет Parcel? - person carloswm85; 22.12.2020

Вы можете найти техническое сравнение на npmcompare

Сравнение browserify, grunt, gulp и webpack

Как видите, webpack очень хорошо поддерживается, и новая версия выходит в среднем каждые 4 дня. Но у Gulp, похоже, самое большое сообщество из всех (с более чем 20K звезд на Github) Grunt кажется немного забытым (по сравнению с другими).

Поэтому, если нужно выбрать одно из них, я бы выбрал Gulp.

person dcohenb    schedule 01.05.2016
comment
webpack теперь 26k запускается на Github и gulp с 25,7k. Больше не могу принимать решения по фактору популярности ... - person Rayee Roded; 29.03.2017

Что такое webpack и webpack-dev-server? Официальная документация говорит, что это сборщик модулей, но для меня это просто средство выполнения задач. Какая разница?

webpack-dev-server - это интерактивный перезагружаемый веб-сервер, который Webpack Разработчики используют для получения немедленной обратной связи о том, что они делают. Его следует использовать только во время разработки.

Этот проект во многом основан на инструменте модульного тестирования nof5.

Webpack, как следует из названия, создаст ЕДИНЫЙ пакет для Интернета. Пакет будет свернут и объединен в один файл (мы все еще живем в эпоху HTTP 1.1). Webpack творит чудеса, объединяя ресурсы (JavaScript, CSS, изображения) и вставляя их следующим образом: <script src="assets/bundle.js"></script>.

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

Где бы вы использовали браузер? Разве мы не можем сделать то же самое с импортом узлов / ES6?

Вы можете использовать Browserify для тех же задач, что и Webpack. - Однако Webpack более компактен.

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

Когда бы вы использовали gulp / grunt вместо плагинов npm +?

Вы можете забыть Gulp, Grunt, Brokoli, Brunch and 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 или аналогичные инструменты.

person prosti    schedule 22.11.2016

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.

person Dmitry Sheiko    schedule 14.08.2017

Yarn - недавний менеджер пакетов, который, вероятно, заслуживает упоминания.
Итак, вот он: https://yarnpkg.com/

Насколько я знаю, он может получать зависимости как от npm, так и от bower, а также имеет другие полезные функции.

person Ellone    schedule 14.10.2016