这里假设您已经成功安装了ClojureScript和Node.js。
给定:
math101
|
|
| `
| `
| `
package.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依赖项。
math.cljs
(ns com.example.math)
(defn add [x y]
(+ x y))
1. 设置构建工具
在 math101
的根目录中运行 yarn shadow-cljs init
。
这将创建一个名为 shadow-cljs.edn
的文件,其中包含一些默认设置:
{:source-paths
["src/dev"
"src/main"
"src/test"]
:dependencies
[]
:builds
{}}
让我们做出一些改变。
首先,您不需要这么多源路径:
{:source-paths
["src"]
:dependencies
[]
:builds
{}}
那我们来新增一个构建配置:
{: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
✨✨✨
需要导出不止一个函数吗?没问题。
我们来添加subtract
:
(ns com.example.math)
(defn add [x y]
(+ x y))
(defn subtract [x y]
(- x y))
现在让我们更新构建配置:
{: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
会生成非生产代码(即未压缩的,我不确定是否删除了无用代码,并且Google Closure还没有运行任何优化)。
生成生产就绪代码的命令是shadow-cljs release
,但您可能需要在构建配置之前进行微调。
我强烈建议您投入时间阅读shadow-cljs文档。这是一个很棒的工具。