如何将 Framework 7 与 shadow-cljs 和 clojurescript 集成

How to integrate Framework 7 with shadow-cljs and clojurescript

当我尝试在 clojurescript 项目中初始化 Framework7 和 Framework7-React 时,使用 shadow-cljs 出现如下错误:

f7.js:31 Uncaught TypeError: Framework7 is not a constructor
   at Object.init (f7.js:31)
   at F7App.value (app.js:162)
   at commitLayoutEffects (react-dom.development.js:21965)
   at HTMLUnknownElement.callCallback (react-dom.development.js:363)
   at Object.invokeGuardedCallbackImpl (react-dom.development.js:412)
   at invokeGuardedCallback (react-dom.development.js:467)
   at commitRootImpl (react-dom.development.js:25025)
   at exports.unstable_runWithPriority (scheduler.development.js:816)
   at runWithPriority (react-dom.development.js:12189)
   at commitRoot (react-dom.development.js:24866)

Framework7 初始化通常无外乎以下内容

// Import Framework7
import Framework7 from 'framework7/framework7-lite.esm.bundle.js';

// Import Framework7-React Plugin
import Framework7React from 'framework7-react';

// Import Framework7 Styles
import 'framework7/css/framework7.bundle.css';

// Init F7 React Plugin
Framework7.use(Framework7React);

有一个 hacky 解决方案,涉及两个单独的构建管道以获得 Framework7 up 和 运行ning 在一个简单的 shadow-cljs 示例项目中。

我创建了一个显示两个版本的 a test project,非工作的 clojurescript 版本,发生错误的地方可以是 运行 by:

npx shadow-cljs watch :direct-no-webpack

它使用 client2.cljs

工作版本使用 ES6 导入语法初始化 Framework7,并使用 webpack 进行转译。

yarn run build-dev
npx shadow-cljs watch :direct

它产生上述错误。

我不是很了解,Framework7到底是怎么回事,因为涉及到多个包装器。

如何通过 Clojurescript 和 Shadow-CLJS 正确导入和使用 Framework7?

我对 Framework7 一无所知,但通常最好只遵循最基本的说明。在这种情况下,我没有添加额外的构建配置,只是直接需要包。

(ns foo.bar
  (:require
     ["framework7" :as f7]
     ["framework7-react" :as f7r]))

;; avoiding top-level side-effects because of hot-reload
(defn init []
   (.use f7 f7r))

我不知道这是否真的有效,但它没有抛出错误。避免直接访问“.esm.js”文件,因为如果您访问这些文件但 "framework7-react" 访问不同的文件可能会导致冲突。目前不支持混合 CommonJS 和 ESM 文件。

.css shadow-cljs 不支持导入。

尽管我读了 shadow-clj guidelines on how to use npm packages。我不得不使用 node_modules 目录中 Javascript 文件的直接路径。

正确的导入是:

(ns app.ui.client2
  (:require
     ["framework7/framework7-lite.esm.bundle.js" :default Framework7]
     ["framework7-react/framework7-react.esm.js" :default Framework7React]))

我修改了问题中提到的测试项目