本文由Thomas Greco和JérémyHeleine进行同行评审。 感谢所有SitePoint的同行评审人员使SitePoint内容达到最佳状态!
几个月以来,越来越多的开发人员坚持“永远押在JavaScript上”的哲学。 但是,可编译为JavaScript的语言的数量正在增长。 此类语言的一些示例是Dart,TypeScript,CoffeeScript和ClojureScript。
在本文中,我们将讨论ClojureScript,这是针对Clojure的 ,针对JavaScript的新编译器。 我们将探讨使用ClojureScript的好处,以及如何快速设置它以使用npm和您喜欢的Node.js库。
为什么选择ClojureScript?
在线上有许多文章介绍了ClojureScript的好处。 一些汇总的高级点是:
- 简单性 :就语法而言,ClojureScript是一种基于Lisp的语言,为它提供了最少的语法。 实际上,它是如此之小,以至于我们将在本文中进行介绍。 除了简单的语法外,ClojureScript还提供了有助于简化异步代码的工具。
- 安全 :这意味着更少的错误! ClojureScript和其他功能性编程语言具有许多有助于减少和缓解常见错误的属性。
- 性能 :ClojureScript使用Google的Closure Compiler 。 这允许ClojureScript利用无效代码消除和其他功能。
- 实时编码 :ClojureScript生态系统提供了许多工具来进行“实时编码”。 这意味着一旦更改了代码,它就会立即反映在您的实时项目中。 在本文中,我们将研究Figwheel,以便您可以更好地理解该概念。
- 代码重用 :ClojureScript可以通用运行,或者像许多人所说的“同构”运行。 这意味着您可以在客户端和服务器上运行相同的代码。 这已成为Node.js生态系统中的一种流行模式。 此外,ClojureScript可以从Node.js和Java生态系统导入库。
设置Clojure(脚本)工具链
在本文中,我们将在Mac OSX环境中安装工具链。 ClojureScript Wiki提供了有关在其他环境中安装 (如果需要)的指南。 我们将需要一些系统依赖性才能开始。 其中之一是流行的OSX软件包管理器Homebrew 。
安装最新的Java版本
ClojureScript需要最新的Java版本(在撰写本文时为版本8)。 如果在这些练习中的任何时间,您遇到运行lein
的错误,如下所示:
Exception in thread "main" java.util.regex.PatternSyntaxException:
Unknown inline modifier near index 2 (?U)^[\p{Alpha}_$]^, compiling:(cljs/util.clj:158:33)
然后,您需要最新版本的Java。
首先,在命令行界面上执行以下命令:
brew tap caskroom/cask
brew install brew-cask
如果出现错误“已经安装”,请按照说明解除链接,该链接将出现在脚本中。 完成后,再次安装。 可以使用以下命令完成此操作:
brew unlink brew-cask
brew install brew-cask
此时,执行我们需要的最后一条命令:
brew cask install java
安装Leiningen
Leiningen是Clojure项目的构建工具。 我们将使用它来运行ClojureScript代码并安装依赖项。 此步骤假定已安装Homebrew ,并向我们提供了brew
命令。
brew install leiningen
如果此步骤失败,则可能需要手动安装 。
使用副本
现在我们已经安装了列宁根,我们可以开始熟悉ClojureScript语法。
执行lein repl
命令,您应该得到类似的输出:
$ lein repl
nREPL server started on port 58371 on host 127.0.0.1 - nrepl://127.0.0.1:58371
REPL-y 0.3.7, nREPL 0.2.10
Clojure 1.7.0
Java HotSpot(TM) 64-Bit Server VM 1.6.0_65-b14-466.1-11M4716
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
Results: Stored in vars *1, *2, *3, an exception in *e
user=>
我们现在在ClojureScript Repl中。 这使我们可以快速执行ClojureScript并查看结果。 要退出副本,您可以按Control+D
完成此步骤后,我们现在准备深入研究ClojureScript的语法,并从中获得乐趣!
ClojureScript语法
ClojureScript是一种功能性语言,这意味着它具有功能和有限的其他语言构造。 在以下各节中,我将介绍该语言的功能。
原语
ClojureScript具有以下原始类型:
- 数
user=> 1.23 1.23
- 串
user=> "foo" "foo"
- 向量(数组)
user=> [:bar 3.14 "hello"] [:bar 3.14 "hello"]
- 映射(关联数组)
user=> {:msg "hello" :pi 3.14 :primes [2 3 5 7 11 13]} {:msg "hello", :pi 3.14, :primes [2 3 5 7 11 13]}
- 关键字(用于访问地图)
user=> :foo :foo
- 设置(不同数组)
user=> #{:bar 3.14 "hello"} #{"hello" 3.14 :bar}
一直发挥作用
函数是ClojureScript的构建块。 您甚至可以使用内置的defn
函数定义自己的函数。
您可以在下面看到函数定义的示例。 在这里,我们将定义一个名为myfunction
的函数。 它接受一个参数argument1
并返回它。 它不是一个非常有用的函数,但却是语法的一个很好的例子。
user=> (defn myfunction [argument1] argment1)
如果语法看起来有些怪异,则在Javascript中等效:
function myfunction(argument1){
return argument1;
}
通过在函数名称和参数之间加上括号来调用函数:
user=> (myfunction "hello world")
"hello world"
在非功能性编程语言中,有特殊的“运算符”或关键字。 在Javascript中,一些常用的运算符是+ - == if
。 在ClojureScript和其他基于Lisp的语言中,没有特殊的运算符。 这些只是常规功能。
如果语句是函数:
user=> (if true "do true stuff here" "do false stuff here")
"do true stuff here"
数学运算符也是函数,如下所示:
user=> (+ 2 3)
5
user=> (* 2 3)
6
有关ClojureScript同义词的Javascript的更多示例,请访问此网站 。
创建一个Node.js – ClojureScript项目
启动ClojureScript项目很简单。 列宁根提供了项目模板,可帮助您启动并运行样板项目。
模板是一个很好的资源,可以用来查看ClojureScript项目的其他用途和配置。 Clojars.org具有模板集合,其他模板可以在Web上找到。 对于我们的项目,我们将使用Nodejs Figwheel项目模板 。
首先,在命令行界面上执行以下命令:
$ lein new figwheel-node hello-world
这将在目录./hello-world
创建一个新的ClojureScript项目。 本文的其余部分假定hello-world
被用作项目名称。 如果需要,可以使用其他名称,但我建议您坚持使用该名称,这样您就可以按照本文进行操作,而不必担心会出错。
话虽如此,移动到创建的目录并安装npm依赖项:
$ cd hello-world
$ npm install
兴趣点
项目文件夹包含一些文件。 在本节中,我想强调一些关于它们的重要概念:
-
package.json
:Node.js项目应该对此很熟悉。 我们的npm
依赖项将在此处添加。 -
project.clj
:此文件是ClojureScript项目配置文件。 这是ClojureScript的package.json
版本,我们在其中配置Clojure依赖项和编译目标。 该文件还包含项目详细信息,例如标题和描述。 -
figwheel.js
:该文件特定于Figweel项目。 这是我们项目的引导文件。 它将Figwheel指向我们的源代码,以便可以监视它的更新。 我们将使用node figwheel.js
运行它。 -
./src/hello-world/core.cljs
:这是我们的入口点源文件。 这是我们开始项目的地方。 可以认为它类似于Node.js项目中的index.js
文件。
core.cljs
文件包含以下内容。 我已经添加了评论,以便您了解发生了什么:
;; This defines a namespace and necesscary dependencies for the current file
(ns hello-world.core
(:require [cljs.nodejs :as nodejs]))
;; This updates the default println method to write to Node.js stdout
(nodejs/enable-util-print!)
;; The main function of the module
;; it prints "Hello World!" to stdout
(defn -main []
(println "Hello world!"))
;; *main-cli-fn* is a semi-magic var that's used to set the entry
;; *point for a node app
(set! *main-cli-fn* -main)
运行项目
要执行当前项目,请打开一个终端窗口,然后转到我们的hello-world项目目录。 然后,执行以下操作:
lein figwheel
这将启动Figwheel,等待构建更新。 保持该终端运行,并打开一个单独的终端。 在这个新终端中,再次移至项目目录并执行以下命令:
node figwheel.js
您应该看到输出“ Hello world”,如下所示:
$ node figwheel.js
Hello world!
Figwheel: trying to open cljs reload socket
Figwheel: socket connection established
将Express.js用于Web服务器
现在我们有了ClojureScript项目设置的基础,让我们开始在新终端中使用一些熟悉的库。 在我们的hello_world
目录中,执行以下命令:
npm install --save express
然后,我们需要更新./src/hello-world/core.cljs
,如下所示:
(ns hello-world.core
(:require [cljs.nodejs :as nodejs]
[clojure.string :as string]))
(nodejs/enable-util-print!)
(defonce express (nodejs/require "express"))
(defonce http (nodejs/require "http"))
(defonce server-port 3000)
(def app (express))
(. app (get "/hello"
(fn [req res] (. res (send "Hello world")))))
(def -main
(fn []
(doto (.createServer http #(app %1 %2))
(.listen server-port))))
(.listen server))))
(println (string/join " " ["Server running on" server-port]) )
(set! *main-cli-fn* -main)
现在,当您在项目上运行node figwheel.js
时,您应该会看到一条输出,说running on 3000
。 如果您访问URL http:// localhost:3000 / hello ,则应该看到快速路线的结果为“ Hello world”。
结论
在本文中,我们讨论了如何设置新的ClojureScript项目并在其中安装流行的Node依赖项。 这为我们进一步熟悉ClojureScript作为一种语言奠定了良好的基础。 我还汇总了该项目的源代码,您可以在Github上找到它 。 它超出了本文的范围,并演示了如何集成React服务器端渲染。
From: https://www.sitepoint.com/introduction-to-clojurescript/