是否可以混合TypeScript和amp; ClojureScript

时间:2016-11-17 22:50:33

标签: typescript clojurescript

我目前正在我的一个项目中使用带有React和webpack的TypeScript 2.0。我正在考虑尝试使用ClojureScript但是我想先从小开始构建单个屏幕。

是否可以在一个项目中将两者混合在一起?

理想情况下,我想使用Clojure内置的组件通过ES6导入来使用。

主要原因是将团队/ myslef引入clojure,但我们已经在TypeScript中使用了一些代码库。我知道很容易生成完全独立的捆绑并引用它,但这并不理想。

3 个答案:

答案 0 :(得分:5)

ClojureScript的输出是JavaScript,它可以定义React组件和任意代码。例如,如果使用Reagent 0.6.0,则create-class的输出可以直接用作组件。

但是!混合模式项目构建配置具有挑战性。一种方法是使ClojureScript页面成为主机项目所需的库,在这种情况下,您可以独立构建和测试ClojureScript组件,然后将输出文件打包为主项目的依赖项。这样做的好处是能够快速迭代开发组件(使用figwheel / devcards)。

答案 1 :(得分:0)

可能?是。建议?并不是的。如果混合使用不同的语言,则存在将两者混合在同一代码块中的风险,可以导致错误。如果你是一个细心的程序员,那么你将会全力以赴。

答案 2 :(得分:0)

原则上,是的,你可以这样做。像其他答案一样,我认为大多数时候这不是一个好主意,但我当然可以相信它可能存在的情况。

假设您在两者之间使用兼容的模块系统(例如,两者都按照您的建议编译为ES6模块),那么您可以编写一些ClojureScript,将其编译为my-cjs.js,添加{{1} }文件到包含my-cjs.d.ts的TypeScript,将其作为declare module "my-cjs";导入TS,然后开始使用它。

为了更进一步,您可能希望构建和维护自己的类型定义,而不是使用此ambient shorthand module设置(最简单的开始,但import { export1, export2 } from "my-cjs"将输入您的所有ClojureScript) 。据我所知,没有任何有用的方法可以自动生成ClojureScript中的兼容类型定义,因此您必须手动保持最新,这可能会也可能不会比您的情况更加努力,具体取决于如何很多脚本的API都会发生变化。

更棘手的部分可能是将两个独立编译的输出组合在一起,以便正确加载ES6模块。您需要将TypeScript JS文件输出到一个文件夹中,将ClojureScript JS输出到另一个文件夹,然后以某种方式组合这些文件夹以使路径很好地排列(您可以直接将它们编译到同一个文件夹中,但是我首先从组合开始,以保​​持简单。这取决于你如何设置编译步骤,但它肯定是可行的。

我的目标是将两者编译成文件结构,如:

any

然后将这些结合起来作为第二步:

/cjs-output
 |- /my-component
    |- my-cjs-script.js
/ts-output
 |- my-ts-code.js
 |- some-more-ts-code.js

据我所知,webpack没有可用的ClojureScript加载器,所以无论如何你都必须手工完成编译。你究竟想把它挂钩到Webpack是一个悬而未决的问题 - 我通常首先让TS + CJS到JS步骤在webpack之外工作,然后使用webpack从JS开始处理这个过程,然后再集成更多,但是YMMV。

从那里/output |- /my-component |- my-cjs-script.js |- my-ts-code.js |- some-more-ts-code.js 应该能够在运行时导入my-ts-code.js就好了,只要你有my-component/my-cjs-script的类型定义,那么tsc应该很乐意编译对你而言。