reagent/docs/0.8-upgrade.md

3.0 KiB

0.8 Upgrade guide

The necessary changes depend on what environment you target, and how you want to provide React.

Build Browser Node
Cljsjs :none Supported Requires Cljs 1.10.145+
Cljsjs :advanced Supported Requires Cljs 1.10.145+
node modules :none Supported Supported
node modules :advanced Supported Partially supported
(ReactDOM/server currently broken)

Browser - Cljsjs

Using Reagent with Cljsjs packages doesn't require changes, other than making sure you update Cljsjs React dependencies, if you have direct dependencies to them.

Browser - node modules

If react, react-dom and create-react-class are available in node_modules directory, ClojureScript compiler will use these with Reagent. To disable this by adding :npm-deps false compiler option.

If you don't want to call npm and manage package.json, you can use :npm-deps and :install-deps compiler options to install the packages automatically.

You can use :process-shim compiler option to provide process.env.NODE_ENV constant which is used by JS code to enable development and production builds. ClojureScript compiler will automatically set this constant to production value when using :advanced optimizations. This enables the React production build.

Browser - loading React from CDNJS or custom Webpack bundle

TODO: Not tested properly

If you want to load React.js yourself from external JS file (CDN) or from custom bundle, it should be possible to override the Cljsjs foreign-libs, while still using externs from Cljsjs packages. To override the foreign-libs, you can provide following compiler option:

:foreign-libs
 [{:file "empty.js",
   :provides ["react" "react-dom" "create-react-class" "react-dom/server"],
   :requires [],
   :global-exports {react React
                    react-dom ReactDOM
                    create-react-class createReactClass
                    react-dom/server ReactDOMServer}}]

You'll also need to create the mentioned empty.js file (FIXME: relative to project.clj?).

If your bundle provides other libraries, you could extern :provides and :global-exports (e.g. prop-types).

NodeJS - Cljsjs

Requires f7d611d87f

Available in 1.0.46+

Reagent should use Cljsjs libraries by default even when running on Node.

NodeJS - node modules

Install react, react-dom and create-react-class npm packages, and ClojureScript should automatically use require to load React for Reagent.

Electron

???

React-native

https://github.com/drapanjanas/re-natal/issues/128

Common Problems

Mismatch with Cljsjs and npm packages

If you have one npm package installed, e.g. react, you also need to provide others (react-dom and create-react-class), else Cljsjs packages would be used for these, and packages from different sources don't work together.