Ответ 1
Другая структура, которая удовлетворяет всему моему критерию, выпущенному недавно: http://duojs.org/ (а также поддерживает обработку других ресурсов, таких как CSS, как зависимостей).
Несмотря на то, что существуют большие решения для управления зависимостями на стороне сервера, я не смог найти ни одного, удовлетворяющего всем моим потребностям, чтобы иметь согласованный рабочий процесс управления зависимостями JavaScript на стороне клиента. Я хочу удовлетворить эти 5 требований:
bower.json
dependency.json
файле для менее известных библиотек (npm позволяет указать на git repos)<script>
на стороне клиентаВ браузере я должен использовать require стиль:
var $ = require('jquery');
var _ = require('underscore');
Или еще лучше, headjs style:
head.js(['jquery', 'underscore', 'mylib'], function($, _, mylib) {
// executed when all libraries are loaded
});
Если нет такого единственного инструмента, какая лучшая комбинация инструментов, то есть цепочка инструментов, которую я могу комбинировать, используя что-то вроде volo (или grunt)?
Я уже изучил все инструменты, с которыми я связан здесь, и они удовлетворяют только до 3 моих требований в лучшем случае индивидуально. Поэтому, пожалуйста, не публикуйте снова об этих инструментах. Я бы принял только ответ, который предоставляет один инструмент, который удовлетворяет всем пяти моим требованиям или если кто-то разместит конкретный рабочий процесс/ script/рабочий пример инструментальной цепочки из множества таких инструментов, который также удовлетворяет всем моим требованиям. Спасибо.
Другая структура, которая удовлетворяет всему моему критерию, выпущенному недавно: http://duojs.org/ (а также поддерживает обработку других ресурсов, таких как CSS, как зависимостей).
require.js делает все, что вам нужно.
Мой ответ на этот может помочь вам
Пример:
Иерархия проектов клиентских приложений:
sampleapp
|___ main.js
|___ cs.js
|___ require.js
main.js, где вы инициализируете свое клиентское приложение и настраиваете require.js:
require.config({
baseUrl: "/sampleapp",
paths: {
jquery: "libs/jquery", // Local
underscore: "http://underscorejs.org/underscore-min.js", // Remote
backbone: "https://github.com/documentcloud/backbone/blob/master/backbone-min.js" // Remote on github
},
shim: {
backbone: {
deps: ["underscore", "jquery"] // Backbone depends on jquery and underscore
}
}
});
require(["cs!someCoffeescriptFile", "jquery", "backbone", "underscore"], function (SomeCoffeescriptFile, $, Backbone, _) {
// Dependencies are loaded...
// Execute code
});
Зависимости будут использовать плагин cs при добавлении "cs!". Плагин cs компилирует файл coffeescript.
Когда вы заходите в prod, вы можете предварительно скомпилировать весь проект с помощью r.js.
node ./node_modules/requirejs/bin/r.js -o buildclientconfig.js
Вот ваши требования:
Управляйте зависимостями на стороне клиента в формате, подобном npm package.json или bower component.json. Разные, но КАК ХОРОШО!
Я должен иметь гибкость, чтобы указать на git repo или actual js файлов (в Интернете или локально) в файле dependency.json для менее известные библиотеки (npm позволяют указывать на git repos). Да
Он должен минимизировать и пропущать все библиотеки в один файл, например ender - что единственный js файл, который мне нужно будет поместить в мой script -tag на стороне клиента. ДА с помощью r.js.
У него должна быть встроенная поддержка для coffeescript как Box. Да
В браузере я могу использовать либо стиль require, либо headjs. Да
http://requirejs.org/ - это тот, который вы ищете, я верю
Как @Guillaume86, я думаю, что край приблизит вас к тому, где вы хотите быть.
В полях зависимости управляются с использованием комбинации npm и hem. Использовать npm для явной установки всех внешних зависимостей ваших проектов. использование чтобы определить, какие зависимости (как внешние, так и локальные) должны сшивать вместе для операций на стороне клиента.
Я создал проект скелета, чтобы вы могли видеть, как это будет работать - вы можете увидеть его на https://github.com/dsummersl/clientsidehem
Используйте npm для поиска определенной зависимости, а затем измените package.json чтобы гарантировать, что зависимость будет отслеживаться в будущем. Затем укажите для вашего приложения в slug.json.
Например, предположим, что вы хотите добавить зависимость coffee- script. Просто используйте npm установить зависимость и сохранить ее в файле package.json:
1. npm --save install coffee-script
2. Manually edit the slug.json file. Add "coffee-script" to "dependencies".
Предположим, вы хотели включить свой собственный модуль "bloomfilters", и это не было в реестре npm. Вы можете добавить его в свой проект следующим образом:
1. npm --save install https://github.com/dsummersl/bloomfilters/tarball/master
2. Manually edit the slug.json file. Add "bloomfilters" to "dependencies".
Если вы хотите включить свой собственный кофе или javascript, вы можете сделать это, добавив эти файлы в папку app/. Обратите внимание, что для того, чтобы разоблачить ваш script через метод "require" вы должны сделать его модулем CommonJS. Это очень просто - см. документ по умолчанию.
Если вы хотите включить код non-CommonJS non 'require', вы также можете сшить это путем ссылки на ваш пользовательский javascript или coffeescript через список "libs" в slug.json.
Если вы захотите, Hem будет сшивать ваш CSS. См. документ по умолчанию.
Как только у вас есть ваши зависимости, вы можете использовать подол, чтобы сшить их все вместе.
# make sure all dependencies are present:
npm install .
# make public/application.js
hem build
# see your minified js in public/application.js
Hem предназначался для проекта spinejs, но вы не должны использовать его для этого. Игнорируйте любые документы, в которых упоминается позвоночник, как вы пожелаете...
Ну, я удивлен, что никто еще не упоминал Browserify.
Я уверен, что Hem соответствует вашим требованиям (я использую персональную вилку с дополнительными компиляторами - jade и stylus - это легко для настройки в соответствии с вашими потребностями). Он использует npm для управления зависимостями.
Возможно, вы захотите взглянуть на Yeoman, в котором используются несколько методов, которые помогут вам требования.
Наш рабочий процесс состоит из трех инструментов для производительность и удовлетворенность при создании веб-приложения: yo ( scawnolding tool), grunt (инструмент построения) и bower (для пакета управление).
Встроенная поддержка CoffeeScript, Compass и многое другое. Работает с r.js(RequireJS), unittesting и т.д.
Что касается ваших требований:
Все функции:
Молниеносные леса. Легко поднимите новые проекты с помощью настраиваемые шаблоны (например, HTML5 Boilerplate, Twitter Bootstrap), RequireJS и т.д.
Отличный процесс сборки. Вы не только получаете минимизация и конкатенация; Я также оптимизирую все ваши файлы изображений, HTML, скомпилируйте файлы CoffeeScript и Compass, если вы используете AMD, я передам эти модули через r.js, поэтому вам не нужно.
Автоматически компилировать CoffeeScript и Compass - наши чаты LiveReload процесс автоматически компилирует исходные файлы и обновляет ваш браузер. всякий раз, когда происходит изменение, поэтому вам не нужно.
Автоматически использовать ваши сценарии. Все ваши сценарии автоматически запускаются против JSHint, чтобы гарантировать, что они следуют лучшим языковым методам.
Встроенный сервер предварительного просмотра. Больше не нужно запускать собственный HTTP-сервер. Мой встроенный можно запустить одну команду.
Оптимизация Awesome Image. Я оптимизирую все ваши изображения с помощью OptiPNG и JPEGTran, чтобы ваши пользователи могли тратить меньше времени на загрузку активов и больше времени на использование вашего приложения.
Управление пакетами Killer. Нужна зависимость? Это просто нажатие клавиши далеко. Я разрешаю вам легко искать новые пакеты через командной строки (например, `jouver search jquery), установить их и сохранить их без необходимости открывать браузер.
Тестирование модулей PhantomJS. Легко запускайте свои модульные тесты в безгласном WebKit через PhantomJS. когда вы создаете новое приложение, я также включаю некоторые тестовые леса для ваше приложение.
Bower может соответствовать вашим потребностям (1) и (2) для остальных, которые у вас требуются. Из файла readme:
Bower is a package manager for the web. Bower lets you easily install assets such as images, CSS and JavaScript, and manages dependencies for you.
Чтобы установить пакет:
bower install jquery
bower install git://github.com/maccman/package-jquery.git
bower install http://code.jquery.com/jquery-1.7.2.js
bower install ./repos/jquery
Посмотрите Менеджер пакетов Jam. Ниже приведено описание с его домашней страницы
Для сторонних разработчиков, которые жаждут поддерживаемых активов, Jam - это менеджер пакетов для JavaScript. В отличие от других репозиториев, мы сначала помещаем браузер.
Кажется, много похоже на npm в том, как это работает.
Установите пакет, как показано ниже
jam install backbone
обновление пакетов с помощью
jam upgrade
jam upgrade {package}
Оптимизация пакетов для производства
jam compile compiled.min.js
Зависимости Jam могут быть добавлены в файл package.json
.
Для полной документации прочтите Jam Documentation
Я просто наткнулся на inject.js
Некоторые из функций, из сайта проекта:
Inject (Apache Software License 2.0) - это революционный способ управления вашими зависимостями в агностической библиотеке. Некоторые из его основных функций включают в себя:
- Совместимость с обычным явлением в браузере (экспорт. *)
- Просмотр полной матрицы поддержки CommonJS
- Перекрестный поиск файлов (через easyXDM)
- localStorage (загрузка модуля один раз)
Есть несколько вариантов:
Component также может представлять интерес, он сам не управляет зависимостями, но позволяет использовать исправленные версии других крупных библиотек,
Я использую hem с npm, и я хотел добавить некоторые дополнительные преимущества, которые, как я думаю, пока не были охвачены.
hem build
, если я не публикую приложение.cake
выше, вы можете просто связать напрямую с coffeescript из зависимых проектов.eco
(встроенный Coffeescript) для представлений и Stylus для CSS и компилирует все это вместе с вашим Coffeescript в один JS и один файл CSS.Вот базовый список для настройки с помощью приложения Spine, hem, coffeescript. Не стесняйтесь игнорировать части позвоночника. Фактически, иногда я использую spine app
для настройки структуры каталогов для приложения, отличного от Spine, а затем отредактируйте slug.json
, чтобы перейти к другой структуре компиляции.
curl http://npmjs.org/install.sh | sh
в систему * nix. Я предполагаю, что это доступно из командной строки.npm install -g hem
). Развитие в последнее время разветвлено, поэтому вы можете получить его прямо из github (https://github.com/spine/hem), проверить ветку и npm install -g .
в этой папке.npm install -g spine.app
сделает доступную доступность позвоночника глобальной командойspine app folder
создаст проект Spine под названием app
в folder
, создав правильную структуру каталогов и кучу скелетных файлов, чтобы начать работу.cd
в папку и отредактируйте dependencies.json
для нужных вам библиотек. Добавьте их в slug.json
, чтобы подол знал, где их найти.npm link
любой из ваших локальных пакетов в разработке до node_modules
, и вы можете добавить их в slug.json
для подол (либо index.js
для включения напрямую, либо index.coffee
, если вы хотите, чтобы скомпилируйте его.)npm install .
для загрузки всех зависимостей, которые вы только что ввели.Если вы посмотрите на конфигурацию позвоночника по умолчанию, есть app/lib/setup.coffee
, где вы require
все библиотеки, которые вам нужны из ваших зависимостей. Примеры:
# Spine.app had these as dependencies by default
require('json2ify')
require('es5-shimify')
require('jqueryify')
require('spine')
require('spine/lib/local')
require('spine/lib/ajax')
require('spine/lib/manager')
require('spine/lib/route')
# d3 was installed via dependencies.json
require 'd3/d3.v2'
В index.coffee
вы просто require lib/setup
и загрузите основной контроллер для своего приложения. Кроме того, вам нужно require
любые другие классы в этих других контроллерах. Вы можете использовать spine controller something
или spine model something
для создания шаблонов для контроллеров и моделей. Типичный контроллер позвоночника выглядит следующим образом: node require
:
Spine = require('spine')
# Require other controllers
Payment = require('controllers/payment')
class Header extends Spine.Controller
constructor: ->
# initialize the class
active: ->
super
@render()
render: ->
# Pull down some eco files
@html require('views/header')
# Makes this visible to other controllers
module.exports = Header
По умолчанию созданный index.html
обычно подходит для загрузки вашего приложения, но при необходимости измените его. В соответствии с вашими требованиями он извлекает только один файл js
и один css
, который вам никогда не нужно изменять.
css
. Это намного более гибкий, чем CSS:)folder
запустите hem server
, чтобы запустить сервер заголовков, и перейдите к localhost:9294
, чтобы увидеть свое приложение. (Если вы установили край глобально.) Он содержит несколько скрытых аргументов, например --host 0.0.0.0
прослушивает все порты.Еще одна вещь: обычно hem server
будет автоматически обновляться при обновлении кода и сохранении файлов, что заставляет его отлаживать cinch. Запуск hem build
скомпилирует ваше приложение в два файла, application.js
, который будет уменьшен и application.css
. Если после этого вы запустите hem server
, он будет использовать эти файлы и больше не будет обновляться автоматически. Так что не hem build
, пока вам не понадобится мини-версия вашего приложения для развертывания.
Дополнительные ссылки: Spine.js и начало кренинга
Здесь решение, которое принимает совсем другой подход: упаковывает все модули в объект JSON и требует модулей путем чтения и выполнения содержимого файла без дополнительных запросов.
Чистая реализация демонстрации клиентов: http://strd6.github.io/editor/
https://github.com/STRd6/require/blob/master/main.coffee.md
STRd6/require зависит от наличия пакета JSON во время выполнения. Для этого пакета создается функция require
. Пакет содержит все файлы, которые может потребовать ваше приложение. Дополнительные HTTP-запросы не выполняются, потому что пакет связывает все зависимости. Это так близко, что вы можете получить стиль Node.js на клиенте.
Структура пакета выглядит следующим образом:
entryPoint: "main"
distribution:
main:
content: "alert(\"It worked!\")"
...
dependencies:
<name>: <a package>
В отличие от Node пакет не знает его внешнего имени. Это зависит от pacakge, включая зависимость, чтобы назвать его. Это обеспечивает полную инкапсуляцию.
Учитывая все, что устанавливает здесь функцию, которая загружает файл из пакета:
loadModule = (pkg, path) ->
unless (file = pkg.distribution[path])
throw "Could not find file at #{path} in #{pkg.name}"
program = file.content
dirname = path.split(fileSeparator)[0...-1].join(fileSeparator)
module =
path: dirname
exports: {}
context =
require: generateRequireFn(pkg, module)
global: global
module: module
exports: module.exports
PACKAGE: pkg
__filename: path
__dirname: dirname
args = Object.keys(context)
values = args.map (name) -> context[name]
Function(args..., program).apply(module, values)
return module
Этот внешний контекст предоставляет некоторую переменную, к которой модули имеют доступ.
Функция A require
подвергается воздействию модулей, поэтому им могут потребоваться другие модули.
Дополнительные свойства, такие как ссылка на глобальный объект и некоторые метаданные также подвергаются.
Наконец, мы выполняем программу внутри модуля и заданного контекста.
Этот ответ будет наиболее полезен тем, кто хочет иметь синхронный Node.js стиль require statement в браузере и не заинтересован в удаленных решениях загрузки script.
Зайдите cartero, если вы используете node/express на сервере.
Я предлагаю проверить dojo toolkit, который, как представляется, отвечает большинству ваших требований. Я не уверен, что это CoffeeScript.
dojo работает с модулями, записанными в формате определения асинхронного модуля (AMD). Он имеет систему сборки с пакетами, и вы можете объединить их в один или несколько файлов (называемых слоями). По-видимому, он принимает репозитории типа git, более подробную информацию о системе сборки здесь:
http://dojotoolkit.org/documentation/tutorials/1.8/build/
Для записи в следующем месяце ожидается бета-версия v1.9.
Включение зависимостей с асинхронной загрузкой + браузером будет еще одним хорошим выбором, сравнивается с requirejs
Я создал script (4kb minified) для синхронной загрузки javascripts и css файлов, которые напоминают Java "import" и С++ "using". Это позволяет вам сделать это:
_import('/jquery-min.js'); alert($);
Он не использует мучительный процесс настройки, подобный процессу RequireJS, просто включите script в тег, и вы готовы к работе. Загрузка является синхронной, поэтому нет необходимости вставлять остальную часть кода в обратный вызов, как и в большинстве других загрузчиков script. Захватите это отсюда: https://github.com/maschinak/_import