Как можно разделить проблемы с конвейером ресурсов CoffeeScript и Ruby on Rail? - PullRequest
0 голосов
/ 03 июля 2011

TLDR:

Что вы можете сделать, чтобы объединить несколько файлов CoffeeScript в один файл JS в RoR, все в одном и том же анонимном функциональном блоке?

Длинная версия:

У меня есть несколько CS-файлов, которые будут загружены для части веб-приложения RoR.Я задаюсь вопросом: как можно разделить проблемы с конвейером ресурсов CoffeeScripts и Ruby on Rail 3.1?

Давайте в качестве примера кода используем следующее:

main.js.coffee

window.MyApp = {} # to escape the CoffeeScript anonymous function block
# (I like the anonymous function block because it protects my other

MY_GLOBAL_SETTING = "world!"
$.click "#my_button" myApp.sayHello
# (I could use something like goog.bind here instead of using myApp. Any suggestions? Fat arrow?)

hello.js.coffee

MyApp.sayHello = sayHello () ->
  doComplicatedStuff()
  alert("Hello #{ MY_GLOBAL_SETTING }")

complex.js.coffee

doComplicatedStuff = () ->
  # some really complicated algorithm, for example
  true

У меня есть каталог ресурсов, который выглядит следующим образом:

assets/
  application.js
  application/
    # javascript that gets used with the main application
  secondary_page.js
  secondary_page/
    complicated.js.coffee
    hello.js.coffee
    main.js.coffee

primary.js

//= require secondary_page/main.js.coffee
//= require secondary_page/complicated.js.coffee
//= require secondary_page/hello.js.coffee

Я использовал для компиляции файлов вместе сCoffeeScript как часть процесса сборки, но теперь я хочу использовать вместо него конвейер ресурсов.Я пью RoL 3.1 KOOL-помощь!Ха-ха, если серьезно, конвейер ресурсов выглядит потрясающе.

Проблема, с которой я сталкиваюсь, заключается в том, что файл second.js выглядит следующим образом:

(function() {
  // main.js
).call(this);
(function() {
  // complicated.js
).call(this);
(function() {
  // hello.js
).call(this);

Это предотвращает совместное использование локальных переменных между весь код.MY_GLOBAL_SETTING и doComplicatedStuff недоступны, чтобы сказать привет.

Итак ... что мне делать?Я не могу придумать хороший способ, не введя свой собственный шаг компиляции снова.

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Это распространенный вопрос для разработчиков Rails, начинающих использовать CoffeeScript. Смотрите, например:

Решений предостаточно. Самое простое - это предвосхищать объявления переменных, которые вы хотите видеть за пределами конкретного файла, с помощью @, поскольку this будет указывать на window в самом внешнем контексте каждого файла, а x указывает на window.x когда локальный x не определен.

0 голосов
/ 03 июля 2011

Вероятно, лучший способ сделать это - оставить их в своих анонимных областях, но экспортировать отдельные функции, к которым вам нужен доступ, из других модулей. Из книги Coffeescript Тревора Бернхэма он рекомендует вам сделать это (работает в узлах и браузерах):

root = global ? window
root.exportableFunction = exportableFunction
root.MY_GLOBAL_SETTING = some: 'Setting'
...