我按照本指南使用 webpack + clojurescript,https: //clojurescript.org/guides/webpack 。使用or编译时它可以完美运行,但是当我使用挂钩的对象之一进行编译时,最终会被导入为未定义的对象,从而导致应用程序崩溃。:none
:whitespace
:advanced
window
我尝试了几件事,比如定义和externs.js
使用 window 对象,但我发现很难深入挖掘。
这是我的编译器参数:
{:source-paths ["src/cljs" "src/cljc" "env/prod/cljs"]
:compiler
{:output-to "target/cljsbuild/public/js/app.js"
:output-dir "target/cljsbuild/public/js"
:source-map "target/cljsbuild/public/js/app.js.map"
:optimizations :advanced
:infer-externs true
:pretty-print false
:npm-deps false
:foreign-libs [{:file "dist/index_bundle.js"
:provides ["react" "react-dom" "react-select" "react-table"]
:global-exports {react React
react-dom ReactDOM
react-select Select
react-table ReactTable}}]}}
这是我的 index.js,webpack 的入口点
// Here we define what we need.
// Webpack is gonna use this and produce a bundle.
// cljs will read this bundle and provide the namespaces for us.
import React from 'react';
import ReactDOM from 'react-dom';
import Select from 'react-select';
import ReactTable from 'react-table'
window.React = React;
window.ReactDOM = ReactDOM;
window.Select = Select;
window.ReactTable = ReactTable
webpack 配置很简单
module.exports = {
entry: './src/js/index.js',
output: {
filename: 'index_bundle.js'
}
}
我得到的错误是因为在这样的文件上:
(ns foo
(:require
[react-table :as ReactTable]
[reagent.core :as r]
[clojure.string :as str]))
[...]
(r/adapt-react-class ReactTable)
ReactTable 绑定到nil
. 我可以确认在 js 控制台window.ReactTable
上也是nil
.
只需在编译器选项上更改:advanced
为:whitespace
,并将其他所有内容保持原样,即可解决问题。而在 js 控制台中,window.ReactTable
不再是nil
.
有任何想法吗?:)
----- 编辑(添加解决方法信息)--------
我发现这个用例的一种可能的解决方法是foreign-libs
像这样“拆分”:
:foreign-libs [{:file "dist/main.js"
:provides ["react" "react-dom" "react-select"]
:global-exports {react React
react-dom ReactDOM
react-select Select}}
{:file "dist/react_table.js"
:requires ["react" "react-dom"]
:provides ["react-table"]
:global-exports {react-table ReactTable}}]}}
调整 webpack 配置和入口点会创建两个单独的包,一个只包含一个包,ReactTable
另一个包含所有其他包。我不认为这是一个解决方案,因为真正的问题没有被发现。但这样做可以解决问题。