Как использовать Node и Express с coffeescript и requirejs?
Вот чего я хочу.
- Узловое приложение, использующее экспресс-веб-сервер
- Использование coffeescript на сервере и, что более важно, клиент
- Использование require.js на клиенте (и в конечном итоге на сервере)
Рекомендованный способ подключения клиентского сценария для клиента - использовать connect-assets. Это, кажется, требует использования нефритовых помощников для фактической компиляции coffeescript, например.
!=js('monalisa.js')
похоже компилирует monalisa.coffee и генерирует правильный <script>
тег. Теперь я хочу использовать require.js и здесь я спотыкаюсь. Как мне убедиться, что connect-assets компилирует все правильно, без использования jade-помощников?
Вот мой довольно простой app.js:
require('coffee-script');
var express = require('express')
, http = require('http')
, path = require('path')
, connectAssets = require('connect-assets');
var publicDir = path.join(__dirname, 'public');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use( connectAssets() );
app.use('/public', express.static(publicDir));
app.use(express.logger());
app.use(express.methodOverride());
app.use(app.router);
});
app.configure('development', function(){
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.get('/', require('./routes').index);
app.get('/monalisa', require('./routes/monalisa').monalisa);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
3 ответа
Я создал пакет, чтобы помочь решить эту проблему; это называется https://npmjs.org/package/connect-assets-jspaths.
Из readme:
Монтаж
npm install connect-assets-jspaths
- Обратите внимание, что есть зависимость от CoffeeScript.
Использование на стороне сервера
assets = require "connect-assets"
jsPaths = require "connect-assets-jspaths"
# Snip ...
app.use assets()
# Exports the global function exportPaths() and jsUrl(); see below in View Helpers.
jsPaths assets
# Optionally, pass a log function to see progress
# jsPaths assets, console.log
Следите за изменениями и перекомпилируйте
Теперь вы можете передать некоторые дополнительные функции обратного вызова, и он будет отслеживать изменения в ваших каталогах подключаемых ресурсов.
fileChangedCallback = (err, filePath) ->
console.log "File Changed: #{filePath}"
jsPaths assets, console.log, fileChangedCallback, (err, watcher) ->
console.log "Watcher initialized"
ПРИМЕЧАНИЕ. Возможно, вы захотите отключить это для производственного режима.
Просмотр использования
Этот модуль экспортирует две глобальные функции exportPaths()
а также jsUrl()
,
// Using this in your view
!= exportPaths("jsPaths")
// Turns into this when rendered in production
<script type="text/javascript">
var jsPaths = { "main", "/builtAssets/js/main.13819282742.js" /* snip all the other file paths */ };
</script>
// Using this in your view
- var mainJsPath = jsUrl("/js/main.js")
script(type="text/javascript", data-main="#{mainJsPath}", src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.0.2/require.min.js")
// Turns into this when rendered in production
<script type="text/javascript" data-main="/builtAssets/js/main.13819282742.js" src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.0.2/require.min.js"></script>
Динамические пути RequireJS
Теперь, когда у нас есть переменная с нашими дружественными путями requireJS, мы можем установить эти пути в конфигурации RequireJS
# Example main.coffee file in /assets/js folder
requirePaths =
paths:
jquery: "//cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min"
underscore: "//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min"
backbone: "//cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min"
text: "/js/lib/text"
handlebars: "/js/lib/handlebars"
if jsPaths
for own key, value of jsPaths
# Fix up the lib references
key = key.slice 4 if key.slice(0, 4) == "lib/"
requirePaths.paths[key] = value
require.config
paths: requirePaths.paths
shim:
jquery:
exports: "$"
underscore:
exports: "_"
backbone:
deps: ["underscore", "jquery"]
exports: "Backbone"
require ['app'], (App) ->
new App().initialize()
Попробуйте мимозу, она поможет вам с каждой из этих вещей из коробки. http://www.mimosajs.com/
mimosa new [name]
даст вам стартовый проект со всем этим.
Извините за новый ответ, но я решил пойти и зарегистрироваться. знак равно
Mimosa предоставит вам небольшое приложение Express, если вы выберете Express как часть mimosa new
рабочий процесс. И если вы выберете CoffeeScript
это даст вам приложение Express в CoffeeScript. И он будет включать RequireJS в приложение скаффолда. Так что вам не нужно ничего переписывать. Вам просто нужно подключить ваш материал. Если что-то, что дает вам приложение Express, послужит примером того, как вы можете сделать это самостоятельно, не используя Mimosa.