Импорт в стиле ES6 для цезия
Я работаю с Chrome V61, который имеет встроенную поддержку ES6.
Я получаю сообщение об ошибке:
import Cesium from '../node_modules/cesium/Build/Cesium/Cesium.js';
Uncaught SyntaxError: The requested module does not provide an export named 'default'
Модуль включен в HTML-файл с:
<script type="module" src="scripts/main.js"></script>
Возможно, он не совместим с модулями ES6, но есть ли шанс, что я смогу это сделать?
Полный код:
import Cesium from '../node_modules/cesium/Build/Cesium/Cesium.js';
console.log("I'm the entry point");
var viewer = new Cesium.Viewer('cesiumContainer');
2 ответа
Cesium - это модуль node.js, что означает, что он использует синтаксис модуля node.js module.exports
, а не спецификация модуля ES6 export default { }
, Чтобы использовать Cesium с ES6 на внешнем интерфейсе, вам понадобится что-то вроде Browserify или Webpack, которое позволит вам использовать import Cesium from 'cesium'
,
Как сказал dcr24 в своем ответе, вы можете использовать Cesium с Webpack.
Установить Цезий
npm install --save-dev cesium
Настройте Цезий в Webpack
В webpack.config.js
// The path to the Cesium source code
const cesiumSource = 'node_modules/cesium/Source';
const cesiumWorkers = '../Build/Cesium/Workers';
Далее, мы добавим следующие параметры в наш объект конфигурации, чтобы решить некоторые изюминки с тем, как webpack компилирует Cesium.
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
// Needed to compile multiline strings in Cesium
sourcePrefix: ''
},
amd: {
// Enable webpack-friendly use of require in Cesium
toUrlUndefined: true
},
node: {
// Resolve node module use of fs
fs: 'empty'
},
Теперь давайте добавим псевдоним цезия, чтобы мы могли легко ссылаться на него в нашем коде приложения, как традиционный модуль Node.
resolve: {
alias: {
// Cesium module name
cesium: path.resolve(__dirname, cesiumSource)
}
},
Управление статическими файлами Cesium
Наконец, давайте удостоверимся, что статические файлы актива, виджета и веб-работника Cesium обслуживаются и загружаются правильно.
npm install --save-dev copy-webpack-plugin
Затем потребуйте это в верхней части нашего файла webpack.config.js.
const CopywebpackPlugin = require('copy-webpack-plugin');
Кроме того, добавьте следующее в массив плагинов.
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html'
}),
// Copy Cesium Assets, Widgets, and Workers to a static directory
new CopywebpackPlugin([ { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' } ]),
new CopywebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets' } ]),
new CopywebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' } ])
],
Мы копируем каталоги Активы и Виджеты как есть. Кроме того, мы будем использовать встроенные веб-скрипты, которые уже скомпилированы и оптимизированы с помощью оптимизатора RequireJS. Поскольку веб-работники предназначены для работы отдельно в своем собственном потоке, их можно загружать и запускать как есть. Веб-работники редко, если вообще когда-либо, будут нуждаться в их первоначальной форме для отладки. Мы скопируем их из каталога Build/Cesium/Workers.
Наконец, мы определим переменную среды, которая сообщает Cesium базовый URL-адрес для загрузки статических файлов, используя DefinePlugin, встроенный в веб-пакет. Массив плагинов теперь будет выглядеть так:
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html'
}),
// Copy Cesium Assets, Widgets, and Workers to a static directory
new CopywebpackPlugin([ { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' } ]),
new CopywebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets' } ]),
new CopywebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' } ]),
new webpack.DefinePlugin({
// Define relative base path in cesium for loading assets
CESIUM_BASE_URL: JSON.stringify('')
})
],
Требуются модули цезия в нашем приложении
Общий стиль
Требовать, чтобы все библиотеки Цезия под одним объектом:
var Cesium = require('cesium/Cesium');
var viewer = new Cesium.Viewer('cesiumContainer');
Требовать индивидуальный модуль:
var Color = require('cesium/Core/Color');
var color = Color.fromRandom();
Импорт в стиле ES6
Требовать всю библиотеку цезия под одним объектом:
import Cesium from 'cesium/Cesium';
var viewer = new Cesium.Viewer('cesiumContainer');
Требовать индивидуальный модуль:
import Color from 'cesium/core/Color';
var color = Color.fromRandom();
Более подробную информацию можно найти в этом уроке Cesium и Webpack.
Образец кода можно найти в официальном репозитории.