标签: clojurescript-javascript-interop

如何在ClojureScript中编写不可知的JavaScript库?

假设我有一个cljs包含以下内容的文件:

(ns foo)
(defn add [x y]
  (+ x y))
Run Code Online (Sandbox Code Playgroud)

并希望将其作为JavaScript库提供给非ClojureScript开发人员(主要侧重于node.js)。我可以做这个:

clj -m cljs.main -c foo
Run Code Online (Sandbox Code Playgroud)

但是问题在于输出是针对Google闭包的模块系统(例如goog.require)的。我可以将目标设置为none带有-t标志(而不是浏览器或节点),并且...无法解决此问题。将其设置为node还不能解决问题:否index.js(在Java中称为main),no module.exports = blah blah。似乎它面向的是独立的全节点应用程序,而不是库。

我知道ClojureScript使用google闭包作为其自身的子模块,并且我不一定要摆脱所有这些问题(我不确定您可以这样做)。而且我知道es2015本机JavaScript模块由于其静态特性而退出市场。

可以手动或通过脚本对输出进行按摩,以使其与npm生态系统完美配合,但是令我惊讶的是,没有编译器选项可以实际输出npm友好模块。还是在那里?我只是读--help错了吗?

clojurescript clojurescript-javascript-interop

5
推荐指数
2
解决办法
99
查看次数

使用 Shadow-CLJS 将 react-table 导入 ClojureScript

Web 开发新手在这里。我正在尝试将 NPM react-table 包与 ClojureScript/Reagent 项目一起使用。我无法正确导入包。我所做的:

1/通过NPM安装react-table,在我的项目目录下

2/在我的主命名空间中,我已经包含了 (:require ["react-table" :as rt])

在 REPL 中,我可以看到它正在建立一些连接,因为只要输入rt就会返回#js {:ReactTableDefaults #js {:data #js [], ...

我怎样才能真正创建一个表?我已经尝试过诸如

rt/ReactTable {:data [{:a 1 :b 2} {:a 3 :b 4} {:a 6 :b 8}] :columns [{:Header "a" :accessor "a"} {:Header "b" :accessor "b"}]} 但我一直在打 TypeError: module$node_modules$react_table$lib$index.ReactTable is not a function

我也读过https://code.thheller.com/blog/shadow-cljs/2017/11/10/js-dependencies-in-practice.html但这对我帮助不大。

更新- 使用 figwheel 我到达了某个地方,这就是我想在 shadow-cljs 中重现的内容:

在 project.clj 中: [cljsjs/react-table "6.8.6-0"]

在“视图”命名空间中: (:require [cljsjs.react-table] [reagent.core :as r])

然后这实际上显示了一个表格:

(def ReactTable …
Run Code Online (Sandbox Code Playgroud)

clojurescript reactjs clojurescript-javascript-interop shadow-cljs

3
推荐指数
1
解决办法
878
查看次数

Clojurscript:扩展一个 Javascript 类

我正在尝试使用特定的 JavaScript 框架,该框架需要扩展基类以将其用于应用程序。

基本上我想按照惯用的 ClojureScript 执行以下操作。

class Foo extends Bar {
  constructor() { super("data") }
  method1(args) { /* do stuff */ }
}
Run Code Online (Sandbox Code Playgroud)

我试过

(defn foo
  []
  (reify
    js/Bar
    (constructor [this] (super this "data"))
    (method1 [this args] )))
Run Code Online (Sandbox Code Playgroud)

如果我从 Object 创建一个新类,这会起作用,但正如shadow-cljs正确抱怨的那样,“Symbol js/Bar 不是协议”。另外,我不想添加方法,而是创建一个继承某些方法并重载其他方法的子类。

我想过使用proxy,但“未定义核心/代理”。

当然,我可以创建的实例Barset!新方法,但感觉就像放弃和使用质量较低的语言。

clojurescript clojurescript-javascript-interop

1
推荐指数
2
解决办法
503
查看次数