这假设您已经安装了 ClojureScript 和 Node.js
鉴于:
math101
|-- package.json
|-- src
| `-- com
| `-- example
| `-- math.cljs
包.json
{
"name": "math101",
"version": "1.0.0",
"main": "dist/index.js",
"license": "MIT",
"devDependencies": {
"shadow-cljs": "^2.8.52",
"source-map-support": "^0.5.13"
}
}
笔记:
在继续之前,请确保您已经安装了这两个 NPM 依赖项。
数学.cljs
(ns com.example.math)
(defn add [x y]
(+ x y))
1.设置构建工具
在math101
run的根yarn shadow-cljs init
。
这将创建一个shadow-cljs.edn
使用一些默认设置调用的文件:
;; shadow-cljs configuration
{:source-paths
["src/dev"
"src/main"
"src/test"]
:dependencies
[]
:builds
{}}
让我们做一些改变。
首先,您不需要那么多源路径:
{:source-paths
["src"]
:dependencies
[]
:builds
{}}
然后让我们添加一个构建配置:
;; shadow-cljs configuration
{:source-paths
["src"]
:dependencies
[]
:builds
{:math101 {:target :node-library
:output-to "dist/index.js"
:exports-var com.example.math/add}}}
笔记:
:math101
- 这是我们稍后将使用的构建 ID
:target :node-library
- 这告诉shadow-cljs
你打算创作一个图书馆
:output-to "dist/index.js"
- 您打算发布的代码
:exports-var com.example.math/add
- 您打算发布的函数的“完全限定名称”。这将产生一个默认导出。
补充说明:
:target :node-library 发出的代码可以(通过 require)用作标准节点库,并且对于发布代码以作为编译后的 Javascript 工件重复使用很有用。
资源
有一个:npm-module
可用的目标,但到目前为止:node-library
已经为我选中了所有框。
2. 让我们建造它!
运行yarn shadow-cljs compile math101
。
第一次运行时,shadow-cljs
会下载一堆东西。最终它会完成,当它完成时......
$ node
> var add = require('./dist')
> add(40, 2)
42
✨✨✨</p>
需要导出多个函数?没问题。
让我们添加subtract
:
(ns com.example.math)
(defn add [x y]
(+ x y))
(defn subtract [x y]
(- x y))
现在让我们更新我们的构建配置:
;; shadow-cljs configuration
{:source-paths
["src"]
:dependencies
[]
:builds
{:math101 {:target :node-library
:output-to "dist/index.js"
:exports {:add com.example.math/add
:subtract com.example.math/subtract}}}}
再次运行yarn shadow-cljs compile math101
,完成后:
$ node
> var math101 = require('./dist')
> math101.add(40, 2)
42
> math101.subtract(44, 2)
42
✨✨✨✨✨✨
附录
这只是为了让您入门。shadow-cljs compile
生成非生产代码(即它没有被缩小,死代码没有被删除 AFAIK 并且 Google Closure 还没有运行任何优化)。
生成生产就绪代码的命令是,shadow-cljs release
但您可能需要在之前调整构建配置。
我强烈建议您花时间阅读shadow-cljs 文档。这是一个了不起的工具。