Статьи

Здравствуйте, ClojureScript! (с помощью jQuery)

Я искал что-то действительно минимальное, и первым простым примером в моем поиске в Google была статья Дэниела Харпера . Я избавился от нуара, использовал новейшие версии библиотек, и вуаля — это работает!

Когда у меня появилось мое первое предупреждение «hello world», показывающее загрузку страницы, я решил сделать вещи немного интереснее и представить jQuery. Я нашел Джейк от Криса Грейнджера и решил попробовать . В блоге Криса также есть пример приложения, которое помогло мне решить некоторые проблемы, а именно выяснить, как связывать события. Он ссылается на еще несколько интересных библиотек (а именно fetch & crate), но мне уже хватит. Я думаю, я мог бы провести всю ночь в погоне за такими ссылками.

В конце, интересные фрагменты кода ниже:

project.clj (настроен для компиляции CLJS из src-cljs в ресурсы / public / js / cljs.js):

(defproject hello-clojurescript "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [ring "1.1.6"]
                 [jayq "0.1.0-alpha3"]]
  :plugins [[lein-cljsbuild "0.2.8"]]
  :cljsbuild
  {
   :source-path "src-cljs"
   :compiler
   {
    :output-to "resources/public/js/cljs.js"
    :optimizations :simple
    :pretty-print true
    }
   }
  :main hello-clojurescript.core
  )

core.clj (простое приложение, с упаковщиком Ring, настроенным для обслуживания ресурсов JS):

(ns hello-clojurescript.core
  (:require [ring.adapter.jetty :as jetty]
            [ring.middleware.resource :as resources]))
 
(defn handler [request]
  {:status 200
   :headers {"Content-Type" "text/html"}
   :body
   (str "<!DOCTYPE html>"
        "<html>"
        "<head>"
        "</head>"
        "<body>"
        "<p id=\"clickable\">Click me!</p>"
        "<p id=\"toggle\">Toggle Visible</p>"
        "<script src=\"http://code.jquery.com/jquery-1.8.2.min.js\"></script>"
        "<script src=\"js/cljs.js\"></script>"
        "</body>"
        "</html>")})
 
(def app
  (-> handler
    (resources/wrap-resource "public")))
 
(defn -main [& args]
  (jetty/run-jetty app {:port 3000}))

hello-clojurescript.cljs (этот компилируется в JavaScript):

(ns hello-clojurescript
  (:use [jayq.core :only [$ delegate toggle]]))
 
(def $body ($ :body))
 
(delegate $body :#clickable :click
          (fn [e]
            (toggle ($ :#toggle))))

Полный исходный код с инструкциями можно найти в моем репозитории GitHub .

На данный момент я вижу следующие проблемы:

  • Я действительно зеленый в ClojureScript. Тонны, чтобы учиться здесь!
  • Файл JavaScript, скомпилированный из этого тривиального примера, имеет длину 13 000 строк и весит около 500 КБ. Doh! Прекрасно подходит для локальных разработок на десктопах, но не так хорош для мобильных устройств.
  • Официальные документы для ClojureScript действительно … обескураживают. Как и основная документация Clojure, они довольно академичны и неясны.
  • Документы для jayq … Подожди, не существует? По крайней мере, это довольно тонкий адаптер с небольшой, понятной кодовой базой.