cesium
cesium copied to clipboard
Circular dependencies in Cesium code, detected during the Rollup bundling process, resulted in a warning.
I carefully inspected the files and indeed found that the warning pointed out the location where circular dependencies occurred.
(!) Circular dependencies
node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SLayer.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SNode.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js
node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SLayer.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SNode.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SFeature.js -> node_modules/.pnpm/@[email protected]/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js
I am using the package manager pnpm and Cesium version 1.108.
rollup setting
import json from '@rollup/plugin-json';
import commonjs from '@rollup/plugin-commonjs';
import typescript from '@rollup/plugin-typescript';
import resolve from '@rollup/plugin-node-resolve';
import alias from '@rollup/plugin-alias';
import terser from '@rollup/plugin-terser';
import strip from '@rollup/plugin-strip';
import copy from 'rollup-plugin-copy';
import clear from 'rollup-plugin-clear';
import postcss from 'rollup-plugin-postcss';
import autoprefixer from 'autoprefixer';
import cssnano from 'cssnano';
import { RollupOptions } from 'rollup';
import { URL, fileURLToPath } from 'node:url';
import pkg from './package.json' assert { type: 'json' };
const libName = pkg.name;
export default <RollupOptions>{
input: './src/index.ts',
output: [
{
file: `./dist/CTSWeb3D/${libName}.es.js`,
format: 'es'
},
{
file: `./dist/CTSWeb3D/${libName}.js`,
format: 'iife',
name: libName
}
// {
// file: `./dist/CTSWeb3D/${libName}.umd.js`,
// format: 'umd',
// name: libName
// }
],
plugins: [
alias({
entries: [
{
find: '@',
replacement: fileURLToPath(new URL('./src', import.meta.url))
}
]
}),
clear({
targets: ['dist']
}),
resolve(),
json(),
commonjs(),
typescript({
sourceMap: false,
noForceEmit: false,
tsconfig: './tsconfig.json' // 指定 TypeScript 配置文件路径
}),
postcss({
modules: true,
minimize: true,
plugins: [autoprefixer({ cascade: false }), cssnano()],
sourceMap: false,
// 通过此回调函数设置输出路径和文件名
extract: 'assets/style/index.css'
}),
strip({
include: ['**/*.js', '*.js', '**/*.ts', '*.ts'],
labels: ['unittest'],
functions: [
'console.log',
'console.time',
'console.timeEnd',
'console.dir',
'console.trace',
'console.assert',
'console.info',
'console.table',
'console.debug',
'console.count',
'test',
'ceshi'
]
}),
terser({
maxWorkers: 4
}),
copy({
targets: [
{
src: 'node_modules/cesium/Build/Cesium/Workers',
dest: './dist/CTSWeb3D/Cesium/Workers'
},
{
src: 'node_modules/cesium/Build/Cesium/ThirdParty',
dest: './dist/CTSWeb3D/Cesium/ThirdParty'
},
{
src: 'node_modules/cesium/Build/Cesium/Assets',
dest: './dist/CTSWeb3D/Cesium/Assets'
},
{
src: 'node_modules/cesium/Build/Cesium/Widgets',
dest: './dist/CTSWeb3D/Cesium/Widgets'
},
{
src: 'public/*',
dest: './dist/CTSWeb3D/'
}
]
})
],
onwarn: (warning, warn) => {
if (warning.code === 'EVAL') return; // 忽略 EVAL 类型的警告
warn(warning);
}
};
code
//This is a test code.
import { Cartesian3 } from 'cesium';
export const VERSION = '3.0';
export const ceshi = () => {
const name = Cartesian3.fromDegrees(0, 0, 0).toString();
return name;
};
package.json setting
{
"name": "ctsweb3d_3",
"version": "1.0.0",
"description": "",
"type": "module",
"scripts": {
"dev": "rollup --config rollup.config.dev.ts --configPlugin @rollup/plugin-typescript --sourcemap true",
"watch": "rollup --config rollup.config.dev.ts --configPlugin @rollup/plugin-typescript --sourcemap true --watch",
"build": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript",
"builddts": "rollup -c rollup.config.dts.ts --configPlugin @rollup/plugin-typescript",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"browserslist": "> 0.5%, last 2 versions, Firefox ESR, not dead",
"devDependencies": {
"@rollup/plugin-alias": "^5.0.0",
"@rollup/plugin-commonjs": "^25.0.3",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^15.1.0",
"@rollup/plugin-strip": "^3.0.2",
"@rollup/plugin-terser": "^0.4.3",
"@rollup/plugin-typescript": "^11.1.2",
"@types/node": "^20.4.9",
"@typescript-eslint/eslint-plugin": "^6.3.0",
"autoprefixer": "^10.4.14",
"cssnano": "^6.0.1",
"eslint": "^8.46.0",
"eslint-config-prettier": "^9.0.0",
"eslint-import-resolver-typescript": "^3.6.0",
"eslint-plugin-import": "^2.28.0",
"eslint-plugin-prettier": "^5.0.0",
"node-sass": "^9.0.0",
"postcss": "^8.4.27",
"prettier": "^3.0.1",
"rollup": "^3.28.0",
"rollup-plugin-clear": "^2.0.7",
"rollup-plugin-copy": "^3.4.0",
"rollup-plugin-dts": "^5.3.1",
"rollup-plugin-postcss": "^4.0.2",
"tslib": "^2.6.1",
"typescript": "^5.1.6"
},
"dependencies": {
"axios": "^1.4.0",
"cesium": "^1.108.0",
"lodash": "^4.17.21"
}
}
Thanks for the report @MyDataHouse.
To solve this, IS3* classes will need to be refactored.
Looked into this a little bit more while addressing something else.
It seems a shorter term solution than a full refactor of the I3S
classes is to just extract the I3SDataProvider.loadJson
function into it's own file. That's the only funciton in I3SDataProvider
that is called from all the other files that end up creating the circular dependencies.
• Circular Dependencies
1) packages/engine/Source/Scene/I3SDataProvider.js -> packages/engine/Source/Scene/I3SLayer.js -> packages/engine/Source/Scene/I3SNode.js
2) packages/engine/Source/Scene/I3SDataProvider.js -> packages/engine/Source/Scene/I3SLayer.js -> packages/engine/Source/Scene/I3SNode.js -> packages/engine/Source/Scene/I3SFeature.js
3) packages/engine/Source/Scene/I3SDataProvider.js -> packages/engine/Source/Scene/I3SStatistics.js
4) packages/engine/Source/Scene/I3SDataProvider.js -> packages/engine/Source/Scene/I3SSublayer.js
(output from dpdm
)