Jar*_*ith 5 clojurescript clojurescript-javascript-interop
假设我有一个cljs包含以下内容的文件:
(ns foo)
(defn add [x y]
  (+ x y))
并希望将其作为JavaScript库提供给非ClojureScript开发人员(主要侧重于node.js)。我可以做这个:
clj -m cljs.main -c foo
但是问题在于输出是针对Google闭包的模块系统(例如goog.require)的。我可以将目标设置为none带有-t标志(而不是浏览器或节点),并且...无法解决此问题。将其设置为node还不能解决问题:否index.js(在Java中称为main),no module.exports = blah blah。似乎它面向的是独立的全节点应用程序,而不是库。
我知道ClojureScript使用google闭包作为其自身的子模块,并且我不一定要摆脱所有这些问题(我不确定您可以这样做)。而且我知道es2015本机JavaScript模块由于其静态特性而退出市场。
我可以手动或通过脚本对输出进行按摩,以使其与npm生态系统完美配合,但是令我惊讶的是,没有编译器选项可以实际输出npm友好模块。还是在那里?我只是读--help错了吗?
这假设您已经安装了 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"
  }
}
笔记:
dist/index.js - 这将包含我们转换为 JavaScript 的 ClojureScript 代码shadow-cljs - 我们需要的构建(和依赖管理)工具source-map-support-需要在 Node.js 上运行 ClojureScript在继续之前,请确保您已经安装了这两个 NPM 依赖项。
数学.cljs
math101
|-- package.json
|-- src
|   `-- com
|       `-- example
|           `-- math.cljs
在math101run的根yarn shadow-cljs init。
这将创建一个shadow-cljs.edn使用一些默认设置调用的文件:
{
  "name": "math101",
  "version": "1.0.0",
  "main": "dist/index.js",
  "license": "MIT",
  "devDependencies": {
    "shadow-cljs": "^2.8.52",
    "source-map-support": "^0.5.13"
  }
}
让我们做一些改变。
首先,您不需要那么多源路径:
(ns com.example.math)
(defn add [x y]
  (+ x y))
然后让我们添加一个构建配置:
;; shadow-cljs configuration
{:source-paths
 ["src/dev"
  "src/main"
  "src/test"]
 :dependencies
 []
 :builds
 {}}
笔记:
: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已经为我检查了所有的框。
运行yarn shadow-cljs compile math101。
第一次运行时,shadow-cljs会下载一堆东西。最终它会完成,当它完成时......
$ node
> var add = require('./dist')
> add(40, 2)
42
???
需要导出多个函数?没问题。
让我们添加subtract:
{: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}}}
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 文档。这是一个了不起的工具。
Shadow-cljs通过:target :npm-module支持 CommonJS 格式的输出,它确实支持您所要求的内容。Node 和其他 JS 工具(例如webpack)可以独立使用单独的命名空间。默认的 CLJS 工具不支持此模式。
然而,ClojureScript 的编写很大程度上是基于这样的假设:您的整个程序将由闭包编译器进行优化。这使得编写要包含在其他构建中的库不太理想。以这种方式构建的每个“库”都将包含其自己的版本cljs.core,因此一开始就会非常大,并且包含 2 个以这种方式构建的库将导致灾难,因为它们彼此不兼容。
| 归档时间: | 
 | 
| 查看次数: | 99 次 | 
| 最近记录: |