Я следовал этому руководству при использовании webpack + clojurescript, https://clojurescript.org/guides/webpack. Он отлично работает при компиляции с :none
или :whitespace
, но когда я компилирую с :advanced
, один из объекты, подключенные к window
, в конечном итоге импортируются как неопределенный объект, вызывая сбой приложения.
Я попробовал пару вещей, таких как определение и externs.js
с оконным объектом, но мне трудно глубже в этом разобраться.
Это мои аргументы компилятора:
{: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, точка входа для веб-пакета
// 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
Настройка веб-пакета так же проста, как
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
.
Есть идеи? :)
----- EDIT (добавление информации об обходном пути) --------
Я обнаружил, что возможный обходной путь для этого варианта использования - это "разбить" 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}}]}}
При адаптации конфигурации веб-пакета и точек входа создаются два отдельных пакета, один из которых имеет только ReactTable
, а другой - со всеми остальными. Я не считаю это решением, потому что настоящая проблема не была идентифицирована. Но это решает проблему.