предисловие
В проекте всегда использовалисьwebpack
, в предыдущем абзаце необходимо разработать несколько библиотек классов для использования на других платформах, изначально планировалось продолжать использоватьwebpack
да, но чувствуюwebpack
развиватьjs
Библиотека не только громоздка, но и размер файла после упаковки относительно большой. как раз передvue
исходный код, знаюvue
также черезrollup
упакованный. На этот раз я снова разработал библиотеку классов, поэтому быстро приступил к работе.rollup
.
Эта статья о том, что после того, как у меня будет определенная проектная практика, я вернусь и поделюсь с вами, как быстро начать работу с нуля.rollup
.
чтоrollup
?
Понимание системыrollup
Перед этим кратко разберемсяWhat is rollup?
оrollup
Вступление к официальному документу написано очень четко:
Rollup — это сборщик модулей JavaScript, который компилирует небольшие фрагменты кода в большие сложные фрагменты кода, такие как библиотеки или приложения.
а такжеWebpack
Ориентация на упаковку приложений другая,rollup.js
более сосредоточены наJavascript
Упаковка библиотеки классов.
мы знаемVue
,React
и многие другие известные фреймворки или библиотеки классов.rollup.js
Это упаковано.
Зачемrollup
?
webpack
Я считаю, что все, кто изучает интерфейс, использовали его, так почему же в некоторых сценариях он все еще используется?rollup
Шерстяная ткань? Вот я простоwebpack
а такжеrollup
сделать сравнение:
В основномwebpack
а такжеrollup
В разных сценариях это может играть свои преимущества.webpack
Он имеет «врожденные преимущества» для разделения кода и импорта статических ресурсов, а также поддерживает горячую замену модулей (HMR
),а такжеrollup
Не поддерживается.
Поэтому при разработке приложений вы можете сначала выбратьwebpack
,ноrollup
для кодаTree-shaking
а такжеES6
Модуль имеет поддержку преимуществ алгоритма.Если вашему проекту нужно упаковать только простойbundle
пакет и основан наES6
разработки модуля, вы можете рассмотреть возможность использованияrollup
.
фактическиwebpack
от2.0
Поддерживается с самого началаTree-shaking
, и используяbabel-loader
также может поддерживатьes6 module
упаковка. Фактически,rollup
Постепенно он утратил свое первоначальное преимущество. Но его не забросили, а из-за его простотыAPI
, метод использования предпочитают многие разработчики библиотек, такие какReact
,Vue
и так далее, оба используютrollup
как инструмент сборки.
Начать быстро
Давайте потратим около десяти минут, чтобы понятьrollup
Основное использование и завершениеhello world
.
Установить
Сначала установите глобальноrollup
:
npm i rollup -g
Подготовка каталога (привет, мир)
Затем мы инициализируем каталог проекта, как показано ниже.
├── dist # 编译结果
├── example # HTML引用例子
│ └── index.html
├── package.json
└── src # 源码
└── index.js
Сначала мыsrc/index.js
Напишите следующий код в:
console.log("柯森");
Затем выполните следующую команду в командной строке:
rollup src/index.js -f umd -o dist/bundle.js
Выполняем команду, мы можемdist
создается в каталогеbundle.js
документ:
(function (factory) {
typeof define === 'function' && define.amd ? define(factory) :
factory();
}((function () { 'use strict';
console.log("柯森");
})));
В это время мыexample/index.html
Представить упакованный и сгенерированный вышеbundle.js
файл, откройте браузер:Как мы и ожидали, вывод консоли柯森
.
Здесь мы используемrollup
упакован один из самых простыхdemo
.
Многие студенты могут не понять параметры в приведенной выше командной строке, когда увидят ее здесь, я объясню в свою очередь:
-
-f
.-f
параметр--format
аббревиатура формата сгенерированного кода,amd
значит принятьAMD
стандарт,cjs
дляCommonJS
стандарт,esm
(или es) дляES
стандарт модуля.-f
Значение может бытьamd
,cjs
,system
,esm
('es' также работает),iife
илиumd
любой из . -
-o
.-o
Путь вывода указан, здесь мы выводим упакованный файл вdist
в каталогеbundle.js
На самом деле, помимо этих двух, есть много других часто используемых команд (здесь я перечислю оставшиеся две, которые также чаще используются, полнаяаргументы командной строки свертки):
-
-c
. уточнитьrollup
конфигурационный файл. -
-w
. Отслеживайте исходный файл на наличие изменений и переупаковывайте, если есть изменения.
Используйте файл конфигурации (rollup.config.js
)
Используйте способ использования строки, если параметр меньше, но если вы добавите больше параметров, этот способ этой командной строки будет проблематичным.
Для этого мы можем создать файлы конфигурации, чтобы заключить нужные параметры.
В проекте создайте файл с именемrollup.config.js
файл, добавьте следующий код:
export default {
input: ["./src/index.js"],
output: {
file: "./dist/bundle.js",
format: "umd",
name: "experience",
},
};
Затем выполняется командная строка:
rollup -c
Открытьdist/bundle.js
файл, мы обнаружим, что результат такой же, как результат, упакованный с помощью метода командной строки, описанного выше.
Здесь я кратко объясню параметры файла конфигурации:
-
input
Указывает путь к файлу записи (старая версия — запись, которая устарела) -
output
Указывает содержимое выходного файла. Позволяет передать объект или массив. Когда это массив, несколько файлов выводятся последовательно. Он содержит следующее содержимое:-
output.file
: путь к выходному файлу (старая версия — dest, которая устарела) -
output.format
: Формат выходного файла -
output.banner
: Содержимое добавляется в заголовок файла. -
output.footer
: содержимое добавляется в конец файла
-
На данный момент, я полагаю, вы почти началиrollup
.
Передовой
Однако этого недостаточно для реальных бизнес-сценариев.
Ниже я представлюrollup
Несколько часто используемых плагинов иexternal
Атрибуты,tree-shaking
механизм.
resolve
плагин
зачем использоватьresolve
плагин
В приведенном выше стартовом случае наш упакованный объект является локальным.js
код и библиотеки, но в реальной разработке вряд ли все библиотеки расположены локально, большинство из нас пройдетnpm
Скачать удаленные библиотеки.
а такжеwebpack
а такжеbrowserify
В отличие от других подобных пакетов,rollup
Не уверен, как нарушить правила, чтобы справиться с этими зависимостями. Итак, нам нужно добавить некоторую конфигурацию.
resolve
использование плагина
Сначала добавьте зависимость к нашему проектуthe-answer
, затем изменитеsrc/index.js
документ:
import answer from "the-answer";
export default function () {
console.log("the answer is " + answer);
}
воплощать в жизньnpm run build
.
Здесь для удобства я
rollup -c -w
добавлен кpackage.json
изscripts
середина:"build": "rollup -c -w"
Получит следующую ошибку:упакованныйbundle.js
все еще будетNode.js
Работа, ноthe-answer
Не входит в комплект. Чтобы решить эту проблему, мы объединили исходный код и зависимую стороннюю библиотеку.rollup.js
предоставляет намresolve
плагин.
Сначала установитеresolve
Плагин:
npm i -D @rollup/plugin-node-resolve
Изменить файл конфигурацииrollup.config.js
:
import resolve from "@rollup/plugin-node-resolve";
export default {
input: ["./src/index.js"],
output: {
file: "./dist/bundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve()],
};
Выполнить сноваnpm run build
, вы можете обнаружить, что ошибка исчезла:
Открытьdist/bundle.js
документ:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
var index = 42;
function index$1 () {
console.log("the answer is " + index);
}
return index$1;
})));
пакетный файлbundle.js
Упомянутые модули уже включены в .
Некоторые сцены, хотя мы использовалиresolve
Insert, но, возможно, мы все же хотим, чтобы некоторые библиотеки сохраняли статус внешней ссылки, тогда нам нужно использоватьexternal
свойства, рассказатьrollup.js
Которые являются внешними библиотеками классов.
внешнее свойство
Исправлятьrollup.js
файл конфигурации:
import resolve from "@rollup/plugin-node-resolve";
export default {
input: ["./src/index.js"],
output: {
file: "./dist/bundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve()],
external: ["the-answer"],
};
перепаковать, открытьdist/bundle.js
документ:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('the-answer')) :
typeof define === 'function' && define.amd ? define(['the-answer'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory(global.answer));
}(this, (function (answer) { 'use strict';
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var answer__default = /*#__PURE__*/_interopDefaultLegacy(answer);
function index () {
console.log("the answer is " + answer__default['default']);
}
return index;
})));
В это время мы видимthe-answer
Он был импортирован как внешняя библиотека.
commonjs
плагин
зачем нужноcommonjs
плагин
rollup.js
Ссылки на модули в скомпилированном исходном коде поддерживаются только по умолчанию.ES6+
модуль путьimport/export
. Однако большое количествоnpm
модуль основан наCommonJS
модульный подход, что приводит к большому количествуnpm
Модули не могут быть скомпилированы непосредственно для использования.
таким образом делаяrollup.js
Поддержка компиляцииnpm
модули иCommonJS
Появились плагины в модульном режиме:@rollup/plugin-commonjs
.
commonjs
использование плагина
Сначала установите модуль:
npm i -D @rollup/plugin-commonjs
затем изменитьrollup.config.js
документ:
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
export default {
input: ["./src/index.js"],
output: {
file: "./dist/bundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve(), commonjs()],
external: ["the-answer"],
};
babel
плагин
зачем нужноbabel
плагин?
мы вsrc
добавить в каталогes6.js
Файл (⚠️ здесь мы используем стрелочные функции из es6):
const a = 1;
const b = 2;
console.log(a, b);
export default () => {
return a + b;
};
затем изменитьrollup.config.js
Конфигурационный файл:
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
export default {
input: ["./src/es6.js"],
output: {
file: "./dist/esBundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve(), commonjs()],
external: ["the-answer"],
};
Выполните пакет, вы можете увидетьdist/esBundle.js
Содержимое файла следующее:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
const a = 1;
const b = 2;
console.log(a, b);
var es6 = () => {
return a + b;
};
return es6;
})));
Вы видите, что стрелочные функции сохранены, и такой код не поддерживается.ES6
среда работать не будет. мы ожидаем вrollup.js
Может использоваться во время упаковкиbabel
для завершения транскодирования, поэтому нам нужноbabel
плагин.
babel
Использование плагинов
Сначала установите:
npm i -D @rollup/plugin-babel
Также измените файл конфигурацииrollup.config.js
:
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import babel from "@rollup/plugin-babel";
export default {
input: ["./src/es6.js"],
output: {
file: "./dist/esBundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve(), commonjs(), babel()],
external: ["the-answer"],
};
Затем упакуйте его и обнаружите, что появится ошибка:намекнуть, что мы пропали@babel/core
,потому что@babel/core
даbabel
Основной. Давайте установим его:
npm i @babel/core
Снова запустите пакет и обнаружите, что на этот раз об ошибке не сообщается, но мы пытаемся открыть его.dist/esBundle.js
:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
const a = 1;
const b = 2;
console.log(a, b);
var es6 = (() => {
return a + b;
});
return es6;
})));
Можно обнаружить, что стрелочная функция все еще существует, что явно неверно, указывая на то, что нашаbabel
Плагин не работал. Почему это?
Причина в том, что нам не хватает.babelrc
Документ, добавьте этот файл:
{
"presets": [
[
"@babel/preset-env",
{
"modules": false,
// "useBuiltIns": "usage"
}
]
]
}
Давайте посмотрим.babelrc
настроенpreset env
, поэтому сначала установите этот плагин:
npm i @babel/preset-env
На этот раз, чтобы снова выполнить упаковку, мы открываемdist/esBundle.js
документ:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
var a = 1;
var b = 2;
console.log(a, b);
var es6 = (function () {
return a + b;
});
return es6;
})));
Вы можете видеть, что функция стрелки преобразуется вfunction
, проиллюстрироватьbabel
Плагин работает нормально.
json
плагин
зачем использоватьjson
плагин?
существуетsrc
Создано в каталогеjson.js
документ:
import json from "../package.json";
console.log(json.author);
Содержание очень простое, это ввестиpackage.json
, Затем перейти к печатиauthor
поле.
Исправлятьrollup.config.js
Конфигурационный файл:
import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import babel from "@rollup/plugin-babel";
export default {
input: ["./src/json.js"],
output: {
file: "./dist/jsonBundle.js",
format: "umd",
name: "experience",
},
plugins: [resolve(), commonjs(), babel()],
external: ["the-answer"],
};
Запустите пакет и обнаружите, что произойдет следующая ошибка:намекнуть, что мы пропали@rollup/plugin-json
плагин для поддержкиjson
документ.
json
Использование плагинов
для установки плагина:
npm i -D @rollup/plugin-json
Также измените файл конфигурации и добавьте плагинplugins
Массив подойдет.
Затем снова упаковываем и обнаруживаем, что упаковка прошла успешно, открываем сгенерированныйdist/jsonBundle
содержание:
(function (factory) {
typeof define === 'function' && define.amd ? define(factory) :
factory();
}((function () { 'use strict';
var name = "rollup-experience";
var version = "1.0.0";
var description = "";
var main = "index.js";
var directories = {
example: "example"
};
var scripts = {
build: "rollup -c -w",
test: "echo \"Error: no test specified\" && exit 1"
};
var author = "Cosen";
var license = "ISC";
var dependencies = {
"@babel/core": "^7.11.6",
"@babel/preset-env": "^7.11.5",
"the-answer": "^1.0.0"
};
var devDependencies = {
"@rollup/plugin-babel": "^5.2.0",
"@rollup/plugin-commonjs": "^15.0.0",
"@rollup/plugin-json": "^4.1.0",
"@rollup/plugin-node-resolve": "^9.0.0"
};
var json = {
name: name,
version: version,
description: description,
main: main,
directories: directories,
scripts: scripts,
author: author,
license: license,
dependencies: dependencies,
devDependencies: devDependencies
};
console.log(json.author);
})));
Идеально! !
tree-shaking
механизм
Здесь мы начинаем сsrc/index.js
В качестве примера для иллюстрации:
import answer from "the-answer";
export default function () {
console.log("the answer is " + answer);
}
Измените вышеуказанный файл:
const a = 1;
const b = 2;
export default function () {
console.log(a + b);
}
Выполнить упаковку. Открытьdist/bundle.js
документ:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
var a = 1;
var b = 2;
function index () {
console.log(a + b);
}
return index;
})));
редактировать сноваsrc/index.js
документ:
const a = 1;
const b = 2;
export default function () {
console.log(a);
}
Запустите пакет еще раз и откройте файл пакета:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.experience = factory());
}(this, (function () { 'use strict';
var a = 1;
function index () {
console.log(a);
}
return index;
})));
Нашел что?
Мы обнаружили, что о переменнойb
Определение пропало, потому что эта переменная не используется в исходном коде. ЭтоES
модуль известныйtree-shaking
Механизм, он динамически удаляет неиспользуемый код, делая код более оптимизированным, чтобы наша библиотека классов могла получить более высокую скорость загрузки.
Суммировать
В этой статье кратко рассказывается, что такоеrollup
и как быстро начатьrollup
. На самом деле это только вершина айсберга.rollup
Есть еще много вещей, чтобы играть, о большем вы можете перейти кофициальный сайт перепрошивкиЗапрос
❤️ любовь тройная
1. Если вы считаете, что эта статья неплохая, заходите сюдаДелитесь, лайкайте, смотритеСанлиан, пусть больше людей увидят это~
2. Подпишитесь на официальный аккаунтпередний лес, регулярно снабжаем вас свежими и галантереями и хорошими товарами.
3. На спецучастках носите маску и пользуйтесь средствами индивидуальной защиты.