Владимир Кузнецов, Graph
Владимир Кузнецов, Graph
Frontend Conf 2015, Москва
var FooBarModule = (function () {return {foo: function () { /* some useful code here */ },bar: function () { /* more code here */ }};}());
jQuery.fn.foobar = function (options) {return this.each(function () {// plug-in code here});};
<script src="jquery.js"></script><script src="plugin1.js"></script><script src="plugin2.js"></script><script src="plugin3.js"></script><script src="init.js"></script>
<script src="bundle.js"></script>
$ cat jquery.js \plugin1.js plugin2.js plugin3.js \init.js \> bundle.js
jquerybackbone├─ jquery└─ underscoreitem-list└─ backbonesearch-widget└─ autocomplete└─ jquery
jqueryautocompletesearch-widgetunderscorebackboneitem-list
/* dictionary.js */exports.hello = 'Hello World!';
/* app.js */var dictionary = require('./dictionary.js');console.log(dictionary.hello);
Формат разрабатывался исключительно для выполнения на сервере или внутри приложения.
definedefine.amd — объектdefine('dictionary', {hello: 'Hello World!';});
define('app', ['dictionary'], function (dictionary) {console.log(dictionary.hello);});
define(['require', 'exports', 'module'],function (require, exports, module) {var foo = require('foo'),exports.bar = function () {};});
Универсальная обёртка, которая в зависимости от окружения экспортирует модуль как CommonJS или как AMD.
/* dictionary.js */export const hello = 'Hello World!';
/* app.js */import * as dictionary from './dictionary.js';console.log(dictionary.hello);
Модуль экспортирует функции, переменные или константы, перед объявлением которых указано ключевое слово export.
export var foo = "Hello World!"export function bar() { return "foobar"; };export default function () { return "default"; };
import theDefault from './foobar.js';import {foo, bar} from './foobar.js';import {foo as fooVariable} from './foobar.js';import * as foobar from './foobar.js';
$ browserify main.js > bundle.js
$ browserify -t coffeeify main.coffee > bundle.js
$ browserify -t babelify main.jsx > bundle.js
/* main.js */var template = require('./view.hbs');var html = template({title: "Hello World!"});
$ browserify -t browserify-handlebars main.js > bundle.js
/* main.js */var fs = require('fs');var text = fs.readFileSync(__dirname + '/helloworld.txt', 'utf8');
$ browserify -t brfs main.js > bundle.js
/* bundle.js */var text = "Hello World!";
"browser": {"bootstrap": "./assets/js/bootstrap.js"},"browserify-shim": {"bootstrap": {"depends": ["jquery"]}}
/* main.js */require('bootstrap');
В упаковку автоматически будут добавлены все модули, которые были перечислены в конфигурации для «bootstrap».
"browserify-shim": {"jquery": {"exports": "global:$"}}
Если грузим jQuery из CDN, то упаковывать её не нужно.
Интерактивные экраны в студии London Live:
Общие модули мы вынесли в отдельную упаковку.
$ browserify \-r jquery -r underscore -r backbone \> libs.js
$ LIBS="-x jquery -x underscore -x backbone"$ browserify $LIBS editor.js > editor.bundle.js$ browserify $LIBS viewer.js > viewer.bundle.js
$ watchify main.js -o bundle.js
Нужно явно указать результирующий файл.
Нужны для конвертирования любых статических ресурсов в JavaScript.
var template = require('jade!./template.jade');require('style!css!less!./my-widget.less');
Конфигурация загрузчиков через webpack.config.js:
{ "module":{ "loaders": [{ "test": /\.jade$/, "loader": "jade-loader" }]}}
Некоторые загрузчики и плагины могут создавать дополнительные файлы.
Например, extract-text-webpack-plugin может сохранить стили для модулей в отдельный CSS-файл, а не вставлять их на страницу.
if (!window.Intl) {var waitForChunk = require('bundle!./intl.js);waitForChunk(callback);} else {callback();}
| npm | Bower | |
|---|---|---|
| Пакеты | CommonJS | AMD |
| Зависимости | дерево | список |
| Модули разных версий | да | нет |
Владимир Кузнецов
Twitter: @mista_k
Блог: noteskeeper.ru
Слайды презентации: goo.gl/p61RpF