当前位置:  开发笔记 > 编程语言 > 正文

将ClojureScript添加到现有代码库

如何解决《将ClojureScript添加到现有代码库》经验,为你挑选了1个好方法。

我有一个相当大的React + Relay代码库,它是使用Webpack构建的.是否有可能以某种方式逐步引入ClojureScript + Reagent?

我正在考虑从代码库中的一些较小的功能组件开始并将它们交换出来.这意味着Reagent组件将以某种方式需要从父级接收道具.

这样做的任何想法或工具?一个快速的Google似乎只会在你的ClojureScript应用程序中找到包含JavaScript库的文章,而不是相反.



1> akond..:

您可以创建试剂组件,将其导出,然后将其导入JS代码中.

由于您已经在js项目中拥有webpack/react,因此您需要从cljs项目中排除这些:

:dependencies [[org.clojure/clojure "1.8.0"]
               [org.clojure/clojurescript "1.9.229"]
               [org.clojure/core.async "0.2.391"
                :exclusions [org.clojure/tools.reader]]
               [reagent "0.6.0" :exclusions [cljsjs/react cljsjs/react-dom cljsjs/react-dom-server]]]

现在你必须让Reagent认为你刚刚排除的那些反应文件仍在这里.创建这三个文件:

SRC/cljsjs/react.cljs

(ns cljsjs.react)

SRC/cljsjs /反应/ dom.cljs

(ns cljsjs.react.dom)

SRC/cljsjs /反应/ DOM/server.cljs

(ns cljsjs.react.dom.server)

是的,每个文件中只有一行带有名称空间声明.

现在你可以编写你的组件:

reagent_component/core.cljs:

(ns reagent-component.core
    (:require [reagent.core :as r]))

(def counter (r/atom 5))

(def ^:export test66
    (r/create-class
        {:reagent-render
         (fn [props]
             (let [{:keys [name]} props]
                 [:div 
                  {:on-click (fn [] (swap! counter inc))}
                  name ", I am counting " (clojure.string/join ", " (map inc (range @counter)))])
             )}))

您的cljsbuild部分project.clj可能如下所示:

:cljsbuild {:builds
            [{:id           "min"
              :source-paths ["src"]
              :compiler     {:output-to     "resources/public/js/compiled/reagent_component_min.js"
                             :output-dir    "resources/public/js/compiled/min"
                             :main          reagent-component.core
                             :optimizations :advanced
                             :asset-path    "js/compiled/out"
                             }}]}

为了简洁,我只给了你mincljsbuild 的部分.

lein cljsbuild once min将生成resources/public/js/compiled/reagent_component_min.js文件,必须将其复制到您的Webpack项目中.

在您的主要入口点之前,新的条目将添加到您的webpack.config中:

 entry: [`${APP_DIR}/reagent_component_min.js`, `${APP_DIR}/main.js`],

应将此文件(reagent_component_min.js)从babelification中排除:

module: {
  loaders: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components|reagent_component_min.js)/,
      loader: 'babel-loader',
      query: {
        presets: ['latest']
      }
    }
  ]
}

并在您的JavaScript中,您使用它像这样:

import React from 'react';
import ReactDOM from 'react-dom';

const comp = reagent_component.core.test66;

const element = 
Hello, world {React.createElement(comp, {name: 'akond'})}
; ReactDOM.render( element, document.getElementById('app') );

是的,babel jsx插件无法识别.这就是调用React.createElement的原因.我没弄清楚如何使它看起来更好,但它的工作原理.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有