Quick comparison to the cljs.loader recently added to CLJS.
Things shadow-cljs does for you:
enable-console-print!is a config option, you do not need to call itloader/set-loaded!will be injected for you as well
| (in-ns 'cljs.analyzer) | |
| (defn get-expander* [sym env] | |
| (when-not (or (some? (gets env :locals sym)) ; locals hide macros | |
| (and (excluded? env sym) (not (used? env sym)))) | |
| (let [nstr (namespace sym)] | |
| (cond | |
| (some? nstr) | |
| (let [ns (get-expander-ns env nstr)] | |
| (when (some? ns) |
| (defn my-component [props context updater] | |
| (cljs.core/this-as this | |
| (js/React.Component.call this props context updater) | |
| ;; anything else you want to set-up. use goog.object/set on this | |
| this)) | |
| (gobj/extend | |
| (.. my-component -prototype) | |
| js/React.Component.prototype) |
| package shadow.build.closure; | |
| import clojure.lang.*; | |
| import com.google.javascript.jscomp.*; | |
| import com.google.javascript.jscomp.Compiler; | |
| import com.google.javascript.jscomp.parsing.parser.FeatureSet; | |
| import com.google.javascript.rhino.Node; | |
| import java.util.List; |
Quick comparison to the cljs.loader recently added to CLJS.
Things shadow-cljs does for you:
enable-console-print! is a config option, you do not need to call itloader/set-loaded! will be injected for you as well| var $CLJS = require("./cljs_env"); | |
| require("./cljs.core.js"); | |
| require("./shadow.npm.react.js"); | |
| require("./shadow.npm.react_native.js"); | |
| var cljs=$CLJS.cljs; | |
| var shadow=$CLJS.shadow; | |
| var goog=$CLJS.goog; | |
| var demo=$CLJS.demo || ($CLJS.demo = {}); | |
| goog.dependencies_.written["demo.app.js"] = true; |
| (ns demo.mixed | |
| #?(:cljs (:require-macros [demo.mixed]))) | |
| ;; CLJ cannot compile JS only code | |
| (defn cljs-only [] | |
| (js/console.log "cljs-only doesn't compile in CLJ")) | |
| ;; so it needs to put into a reader conditional | |
| #?(:cljs |
| (ns demo.macro-writing-macros) | |
| (def dom-elements | |
| '[h1 | |
| h2]) | |
| (defn gen-dom-macro [name] | |
| `(defmacro ~name [p# & c#] | |
| (let [kw# ~(-> name str keyword) | |
| children# (into [] c#)] |
| var SHADOW_IMPORT_PATH = "/Users/zilence/code/shadow-cljs/target/shadow-cljs/node-repl/dev/cljs-runtime"; | |
| var SHADOW_ENV = {}; | |
| try {require('source-map-support').install();} catch (e) {console.warn('no "source-map-support" (run "npm install source-map-support --save-dev" to get it)');} | |
| SHADOW_ENV.CLOSURE_NO_DEPS = true; | |
| SHADOW_ENV.CLOSURE_DEFINES = {"shadow.cljs.devtools.client.env.autoload":false,"shadow.cljs.devtools.client.env.proc_id":"4553d9c9-bc8b-4e6b-9a20-ed188e9ffd05","shadow.cljs.devtools.client.env.module_format":"goog","goog.LOCALE":"en","shadow.cljs.devtools.client.env.repl_host":"localhost","shadow.cljs.devtools.client.env.build_id":"node-repl","goog.DEBUG":true,"shadow.cljs.devtools.client.env.reload_with_state":false,"shadow.cljs.devtools.client.env.after_load":null,"shadow.cljs.devtools.client.env.before_load":null,"shadow.cljs.devtools.client.env.repl_port":8200,"shadow.cljs.devtools.client.env.enabled":true,"goog.TRANSPILE":"never"}; | |
| var SHADOW_ROOTS = ["goog"]; |
| (ns demo.a | |
| (:require [demo.b :refer [defcomp]])) | |
| (defcomp my-comp [x y] 1) | |
| (println my-comp) |
| (ns demo.browser | |
| (:require ["react" :as react :refer (createElement)] | |
| ["react-dom" :as rdom :refer (render)] :foo) | |
| (:import ["react" Component])) |