前言

 书接上一回,在了解cljs基本语法后并在clojurescript.net的奇特错误提示后,我们必须痛定思痛地搭建一个本地的开发环境,以便后续深入地学习cljs。

现有的构建工具

 由于浏览器仅能运行JS,而无法直接运行cljs,因此我们需要搭建一个预编译环境将cljs编译成JS后再在浏览器中运行。预编译无非就是JVM和Nodejs两个环境,但具体使用时有如下几种构建工具。

  1. 直接JVM编译
  2. Lein方案
  3. Boot方案
  4. Lumo方案
  5. Shadow-cljs方案
  6. cljs/tool方案

     其中Lein和Boot都是基于JVM编译环境,只是上层的构建方式有所不同,而Lein除了用于构建cljs外还用于构建clj;而Boot则专注于构建cljs。

     Lumo则是基于Nodejs编译环境。

     Shadow-cljs则是node-jre,就是用node模块管理的jvm。

    由于我们只需搭建一个刚好可用的开发环境即可,因此下面只介绍方案1。

搭建一个最基础的——直接JVM编译

下载依赖

  1. Jdk8.0+
  2. ClojureScript 独立JAR

创建工程

# 在家目录下创建工程目录
$ mkdir -p ~/hello_world/src/hello_world/ # 复制cljs.jar文件到工程目录下
$ cp ~/cljs.jar ~/hello_world/ # 创建项目配置文件
$ touch ~/hello_world/build.clj # 创建源码文件
$ touch ~/hello_world/src/hello_world/core.cljs # 创建HTML文件
$ touch ~/hello_world/index.html

build.clj文件中输入

(require '[cljs.build.api :refer [build]])
(build "src"
{:main 'hello-world.core ; 指定程序入口命名空间
:output-to "main.js"}) ; 指定目标代码入口所在文件
;; 注意:其余依赖模块的目标代码默认会生成在out/下

src/hello_world/core.cljs文件中输入

(ns hello-world.core)

; 标准输出重定向到js/console.log
(enable-console-print!) (println "Hello world!")

index.html文件中输入

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--必须放在body中,否则搭建Browser REPL时会报
Uncaught TypeError: Cannot read property 'appendChild' of null
at goog.net.xpc.CrossPageChannel.<anonymous> (crosspagechannel.js:482)
-->
<script src="main.js"></script>
</body>
</html>

现在到了最激动人心的一刻了!编译君!在shell中执行

$ java -cp cljs.jar:src clojure.main project.clj

然后打开浏览器访问index.html就可以在console中看到那句熟悉的Hello world!了。

 现在每次修改代码后均要编译一下,要知道启动Clojure是那么的漫长,所以我新增watch.clj的配置,让它监控src文件的变化来实现自动编译吧!

(require '[cljs.build.api :refer [watch]])
(watch "src"
{:main 'hello-world.core ; 指定程序入口命名空间
:output-to "main.js"}) ; 指定目标代码所在文件

然后运行

$ java -cp cljs.jar:src clojure.main watch.clj

就会自动编译了,是不是舒心多了!等等,还不够。对于快速开发而言,我们还需要一个REPL!

搭建Browser REPL

首先安装个rlwrap,后面会用到!

新增repl.clj文件

(require '[cljs.build.api :refer [build]]
'[cljs.repl :refer [repl]]
'[cljs.repl.browser :refer [repl-env]])
(build "src"
{:main 'hello-world.core
:output-to "main.js"}) ;; 配置REPL
(repl (repl-env)
:watch "src" ; REPL自动监控src目录下的cljs文件
:output-dir "out") ; REPL重用build函数已编译的文件

修改src/hello_world/core.cljs文件

(ns hello-world.core
(:require [clojure.browser.repl :as repl])) ;; 启动Browser REPL
(defonce conn
(repl/connect "http://localhost:9000/repl")) (enable-console-print!) (println "Hello world!")

然后运行

$ rlwrap java -cp cljs.jar:src clojure.main repl.clj

然后打开浏览器访问http://localhost:9000/,这时浏览器访问的是index.html页面,然后我们按F12打开浏览器的console,那么shell中就会有我们心仪已久的REPL了!

这时我们在core.cljs中追加下面代码

(defn add [& more]
(reduce + 0 more))

然后在REPL中加载这个命名空间

(require '[hello-word.core :refer [add]])
(add 1 2 3) ; -> 6

然后再将add改成multi

(defn multi [& more]
(reduce * 0 more))

然后在REPL中重新加载这个命名空间

(require '[hello-word.core :refer [multi]] :reload)
(multi 2 2 3) ; -> 12

 现在我们可以继续深入cljs的学习咯!!!

总结

 开发环境搭建好了,那接下来要从哪里入手呢?大家是不是对(require '[cljs.repl :refer [repl]])(require '[cljs.repl :as repl])等有些疑惑呢?后面我们就从命名空间开始吧!(cljs/run-at (JSVM. :browser) "命名空间就这么简单")

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/7087902.html _肥仔John

(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")的更多相关文章

  1. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  2. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  3. 搭建 AngularJS+Ionic+Cordova 开发环境并运行一个demo

    目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Cordova就是一个中间件,让我们把WebAPP打包成Hybrid ...

  4. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

  5. 转:WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    转自:http://www.cnblogs.com/shaddock2013/p/3155024.html 最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是V ...

  6. WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法

    最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是VMware Workstation + Win8 Pro的虚拟环境, 在漫长的WPexpress_full下 ...

  7. 搭建Eclipse C/C++开发环境

    搭建eclipse C/C++开发环境:     1.下载并安装Eclipse for C++:http://www.eclipse.org.最新版是基于Eclipse 3.5 galileo,文件名 ...

  8. 轻松搭建Windows8云平台开发环境

    原文:轻松搭建Windows8云平台开发环境 Windows Store应用是基于Windows 8操作系统的新一代Windows应用程序,其开发平台以及运行模式和以往传统平台略有不同.为了帮助更多开 ...

  9. vue_使用npm搭建vue2.0脚手架开发环境

    前言: 在使用vue进行开发时需要搭建vue的运行环境,这里主要是使用淘宝镜像cnpm进行搭建vue的脚手架开发环境.主要是分为mac和window两个版本,两个环境的搭建都是大同小异. mac开发环 ...

随机推荐

  1. Tomcat的一些实际操作

    1:tomcat7开启远程debug模式: ./catalina.sh jpda start 2:tomcat支持URL中文,解决tomcat get请求乱码问题(在TOMCAT_HOME/conf/ ...

  2. silverlight WPF 水纹文本框

    silverlight3取消了watertextbox控件,只有自己实现了个,实现了和textbox一样的无差异使用,只需要设置defaulttext就可以了 using System; using ...

  3. 基于路由器物理接口的vlan间路由

    广播域之间来往的数据包都是路由器中继的,所以vlan间的通信业需要路由器提供中继服务,这称作vlan间路由,可以用路由器或三层交换机实现. 配置R1: r1(config)#inter fa0/0r1 ...

  4. 抓包工具 Charles 使用心得

    前言 虽然实习工作还没有着落,但学习还是要继续的嘛,今天就来学习使用下 Mac 下截取网络封包的工具:Charles. 我想,如果你是个善于利用搜索引擎的人,那么在 Google 中输入「Charle ...

  5. Swift学习笔记(4):字符串

    目录: 初始化 常用方法或属性 字符串索引 初始化 创建一个空字符串作为初始值: var emptyString = "" // 空字符串字面量 var anotherEmptyS ...

  6. 二叉树遍历 C#

    二叉树遍历 C# 什么是二叉树 二叉树是每个节点最多有两个子树的树结构 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并 ...

  7. Ubuntu16.04 安装flash player

    sudo apt-get install browser-plugin-freshplayer-pepperflash

  8. Linux parent process and child process when 'sudo'

    如果在一般用户下如user,执行sudo命令,会产生两个进程. ps -ef | grep Container root 4305 643 0 16:37 pts/39 00:00:00 sudo . ...

  9. Promise简介

    Promise是ES6中的函数,规范了如何处理异步任务的回调函数,功能类似于jQuery的defferred.简单说就是通过promise对象的不同状态调用不同的回调函数.目前IE8及以下不支持,其他 ...

  10. 5.Java 加解密技术系列之 DES

    Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比 ...