(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
前言
书接上一回,在了解cljs基本语法后并在clojurescript.net的奇特错误提示后,我们必须痛定思痛地搭建一个本地的开发环境,以便后续深入地学习cljs。
现有的构建工具
由于浏览器仅能运行JS,而无法直接运行cljs,因此我们需要搭建一个预编译环境将cljs编译成JS后再在浏览器中运行。预编译无非就是JVM和Nodejs两个环境,但具体使用时有如下几种构建工具。
- 直接JVM编译
- Lein方案
- Boot方案
- Lumo方案
- Shadow-cljs方案
- cljs/tool方案
其中Lein和Boot都是基于JVM编译环境,只是上层的构建方式有所不同,而Lein除了用于构建cljs外还用于构建clj;而Boot则专注于构建cljs。
Lumo则是基于Nodejs编译环境。
Shadow-cljs则是node-jre,就是用node模块管理的jvm。
由于我们只需搭建一个刚好可用的开发环境即可,因此下面只介绍方案1。
搭建一个最基础的——直接JVM编译
下载依赖
- Jdk8.0+
- 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) "搭建刚好可用的开发环境!")的更多相关文章
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)
原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...
- Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇
原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...
- 搭建 AngularJS+Ionic+Cordova 开发环境并运行一个demo
目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Cordova就是一个中间件,让我们把WebAPP打包成Hybrid ...
- react-native —— 在Windows下搭建React Native Android开发环境
在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...
- 转:WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法
转自:http://www.cnblogs.com/shaddock2013/p/3155024.html 最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是V ...
- WIN7上搭建Windows Phone 8 开发环境——VMware Workstation下Win8 “无法安装Hyper-V, 某个虚拟机监控程序正在运行”问题解决的办法
最近在试着在Windows 7上搭建Windows Phone 8的开发调试环境,使用的是VMware Workstation + Win8 Pro的虚拟环境, 在漫长的WPexpress_full下 ...
- 搭建Eclipse C/C++开发环境
搭建eclipse C/C++开发环境: 1.下载并安装Eclipse for C++:http://www.eclipse.org.最新版是基于Eclipse 3.5 galileo,文件名 ...
- 轻松搭建Windows8云平台开发环境
原文:轻松搭建Windows8云平台开发环境 Windows Store应用是基于Windows 8操作系统的新一代Windows应用程序,其开发平台以及运行模式和以往传统平台略有不同.为了帮助更多开 ...
- vue_使用npm搭建vue2.0脚手架开发环境
前言: 在使用vue进行开发时需要搭建vue的运行环境,这里主要是使用淘宝镜像cnpm进行搭建vue的脚手架开发环境.主要是分为mac和window两个版本,两个环境的搭建都是大同小异. mac开发环 ...
随机推荐
- Redis入门学习
一.摘要 二.五种数据类型的基本命令操作 三.Redis连接池 四.普通同步方式 五.事务方式(Transactions) 六.管道(Pipelining) 七.管道中调用事务 八.分布式直连同步调用 ...
- Java线程安全 关于原子性与volatile的试验
1. 变量递增试验 static /*volatile*/ int shared=0;//volatile也无法保证++操作的原子性 static synchronized int incrShare ...
- Linux:PS命令详解与使用
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,ps命令就是最基本进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵尸.哪些进程占 ...
- 在centos7下安装python3
环境搭建 准备工具: centos7:http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso virtus ...
- 【JQuery基础知识/statusCode(状态码)】---初学者必备
今天,给大家分享一下JQuery的基础知识,简单介绍一下JQuery高级_Ajax,和我们常见的一些statusCode(状态码)~~~ 如果存在错误,请大家多多指正留言~小女子在此谢过! 一.JQu ...
- myEclipse hibernate连接数据库配置方法
Access数据库:
- 初码-Azure系列-迁移PHP应用至Azure的一些实践记录和思考
最近客户在逐步迁移应用从阿里云到Azure,这次又轮到一个PHP+MySQL应用了,顺便也记一下流水账. 需求:迁移部署在阿里云上的ECS服务器(系列2,IO优化+2核4G+50G的SSD云盘+10M ...
- VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用
当在开发和产品上线的时候,我们经常会遇到在同一个地方由于环境的不同而地址也不同的情况,这时候如果在代码中将该地址写死,那势必会造成上线时手动改动,多人开发及多处使用该地址难以维护等一系列问题,为避免这 ...
- 点击空白处隐藏指定dom元素(纯javascript方法)
<script type="text/javascript"> document.onclick = function (event) { event = event ...
- python爬虫从入门到放弃(三)之 Urllib库的基本使用
官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...