Pull to refresh

Простой упаковщик CommonJS модулей для использования в браузере — clinch

Reading time 2 min
Views 4.2K
Если вы пользуетесь stitch и вам его маловато, а browserify показался сложноват по настройкам — попробуйте clinch.

Что в коробке:
  • простой API
  • поддержка .js, .json, .coffee, .eco, .jade
  • develop-mode ready — легко встроить в express, умный кеш с инвалидацией
  • малый overhead на bundle ~ 40 SLOC
  • простой механизм подмены модулей и имитации глобальных объектов


Основная фишка, которую я хотел решить — нативное использование CommonJS модулей, в том числе и зависимостей, устанавливаемых через npm. Понятно, что модули, использующие IO или имеющие C-биндинги работать не будут, но большой пласт простых модулей вполне можно перенести на клиента.
Вторая фишка — мне нравится разработка через тестирование, в идеале — весь клиентский код хорошо бы прогонять через mocha, в автоматизированном варианте.
Ну и приятные бонусы — разумное количество «обвязочного» кода, однозначное разрешение зависимостей, поддержка версий, исключение дубликатов, возможность иметь на странице любое количество бандлов.

На мой взгляд все идеи были вполне успешно реализованы.

Установка — локальная npm install clinch.

Ну и простой пример использования:
#!/usr/bin/env coffee
Clinch = require 'clinch'
packer = new Clinch()
pack_config = 
  bundle : 
    main : "#{__dirname}/hello_world"

packer.buldPackage 'my_package', pack_config, (err, data) ->
  console.log 'Builder, data: \n', data

для 'hello_world.coffee', содержащего
module.exports = 
  hello_world : -> 'Hello World!'

на выходе даст примерно такой результат
(function() {
    <... skip clinch header ...>
    dependencies = {};
    sources = {
"2377150448": function(exports, module, require) {
module.exports = {
  hello_world: function() {
    return 'Hello World!';
  }
};
}};
this.my_package = {
"main": require(2377150448)};
}).call(this);

И в браузере функция будет доступна вот так
hello_world = my_package.main.hello_world

Если идея инжекта в глобальный объект новых свойств не нравится — можно его отключить, кроме того есть несколько настроек для jade-компилятора.
У проекта есть русскоязычный мануал, который наверняка станет лучше благодаря вашим вопросам и замечаниям.
Кроме того, есть демо-проект, в котором можно посмотреть код и результаты на клиенте.

PS. Буду безмерно благодарен всякому, кто научит писать хорошие мануалы.

Update: с 0.2.5 есть возможность зарегистрировать собственный обработчик (или переопределить встроенные), метод называется registerProcessor().
Работает так:
# add .econ processor
packer.registerProcessor '.econ', (file_content, filename, cb) ->
  content = Eco.precompile file_content
  cb null, "module.exports = #{content}"


Пример как настроить и использовать Handlebars — смотрим тут.
Tags:
Hubs:
+6
Comments 29
Comments Comments 29

Articles