Владимир Кузнецов, 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
jquery
backbone
├─ jquery
└─ underscore
item-list
└─ backbone
search-widget
└─ autocomplete
└─ jquery
jquery
autocomplete
search-widget
underscore
backbone
item-list
/* dictionary.js */
exports.hello = 'Hello World!';
/* app.js */
var dictionary = require('./dictionary.js');
console.log(dictionary.hello);
Формат разрабатывался исключительно для выполнения на сервере или внутри приложения.
define
define.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