ClojureScript简介

本文由Thomas GrecoJé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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值