Ожидаемое поведение заключается в том, что JSON будет упакован, потому что он, по-видимому, необходим синхронно во время выполнения. Данные JSON отличаются от файлов изображений, которые загружаются браузером асинхронно, так как они отображаются на странице с помощью src
атрибутов и т. Д.
Как уже упоминалось в комментариях, вы должны использовать разбиение кода. Последняя версия Webpack поддерживает динамический импорт , если вы устанавливаете и используете плагин @babel/plugin-syntax-dynamic-import
.
npm install --save-dev @babel/plugin-syntax-dynamic-import
Затем в babel.config.js
:
module.exports = {
...
plugins: [
"@babel/plugin-syntax-dynamic-import"
]
...
};
Пример
Допустим, у вас есть компонент React, которому могут потребоваться некоторые данные JSON, но не нужно загружать его синхронно как часть пакета. Ваша разделенная версия с кодом non может выглядеть примерно так:
import React from 'react';
import myJSON from './myJSON.json';
export default class MyComponent extends React.Component {
render() {
return <div>{JSON.stringify(myJSON, null, 2)}</div>
}
}
Вместо этого вы можете использовать динамический импорт - в основном импорт во время выполнения, который возвращает Promise, который вы можете использовать для асинхронной загрузки некоторых данных отдельно от вашего пакета:
import React from 'react';
import myJSON from './myJSON.json';
export default class MyComponent extends React.Component {
state = {data: {}};
componentDidMount() {
import(/* webpackChunkName: 'myJSON' */ './myJSON.json')
.then((data) => {
this.setState({data});
});
}
render() {
return <div>{JSON.stringify(this.state.data, null, 2)}</div>
}
}
В качестве альтернативы, вы можете использовать новый React lazy
и Suspense
API (v16.6.0 и выше) для , чтобы динамически импортировать компоненты React , которые разделяются на части отдельно от комплекта. Это может быть предпочтительным, если вы хотите объединить компонент и соответствующие ему данные JSON вместе, но отдельно от основного пакета:
// MyComponent.jsx
import React from 'react';
import myJSON from './myJSON.json';
export default class MyComponent extends React.Component {
render() {
return <div>{JSON.stringify(myJSON, null, 2)}</div>
}
}
// SomeParent.jsx
import React, {lazy, Suspense} from 'react';
const MyComponent = lazy(() => import(/* webpackChunkName: 'MyComponent' */ './MyComponent'));
export default class SomeParent extends React.Component {
render() {
return <div>
<Suspense fallback={<div>Loading...<div>} >
<MyComponent />
</Suspense>
</div>;
}
}
В приведенном выше примере <MyComponent />
и соответствующий ему код, включая данные JSON, будут загружаться только тогда, когда компонент фактически отображается во время выполнения.