CesiumGS / cesium

An open-source JavaScript library for world-class 3D globes and maps :earth_americas:
https://cesium.com/cesiumjs/
Apache License 2.0
12.89k stars 3.48k forks source link

Circular dependencies in Cesium code, detected during the Rollup bundling process, resulted in a warning. #11470

Open MyDataHouse opened 1 year ago

MyDataHouse commented 1 year ago
I carefully inspected the files and indeed found that the warning pointed out the location where circular dependencies occurred.
(!) Circular dependencies
node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SLayer.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SNode.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js
node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SDataProvider.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SLayer.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SNode.js -> node_modules/.pnpm/@cesium+engine@3.0.2/node_modules/@cesium/engine/Source/Scene/I3SFeature.js -> node_modules/.pnpm/@cesium+engine@3.0.2/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"
  }
}
ggetz commented 1 year ago

Thanks for the report @MyDataHouse.

To solve this, IS3* classes will need to be refactored.

jjspace commented 7 months ago

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)