在节点模块中导入THREE.js添加变量或函数

问题描述 投票:0回答:1

我正在尝试重写一个 THREE.js 项目,该项目将 HTML 中的 JS 文件直接包含到基于节点模块的项目中。然后使用webpack将其打包成bundle.js,这样在HTML中,就只包含bundle.js来执行。

原始项目

源项目结构如下所示:

index.html
js/EVAOptions.js
js/EVAPreviews.js
js/EVALoader.js
js/OrbitControls.js
js/thee.min.js

index.html。文件密钥源代码:

<!DOCTYPE html>
<html>
 <head>
    <meta charset=utf-8>
    <title>EVA Visualizaion Project</title>
    <meta name="viewport" content="width=device-width" />
 </head>
 <body>
   <script src="js/three.min.js"></script>
   <script src="js/OrbitControls.js"></script>
   <script src="js/EVAPreviews.js"></script>
   <script src="js/EVAOptions.js"></script>
   <script src="js/EVALoader.js"></script>

   <div id="workspace"></div>

   <script>
      // ...
      evaLoader = new THREE.EVALoader(onLoad, url, options);
      // ...
  </script>
 </body>
</html>

原项目中,index.html 包含了 Three.min.js 后,全局就有了一个 THREE 对象,因此任何 JS 文件都可以修改这三个对象。

正如 EVALoader.js 所做的那样,它通过附加一个函数来修改三个对象。

EVALoader.js关键源码:

THREE.EVALoader = function(onLoad, url, options){
    // todo something
}

还有许多其他 JS 文件直接向这三个对象添加函数或变量。

目标项目

由于原始项目很复杂,我首先尝试最小化对原始项目的修改。我知道这可能不是真正的基于模块的重写,但项目可运行第一对我来说是一个很大的动力。

对于像 OrbitControls.js 这样的三个插件或实用程序来说很简单,可以使用

进行处理
import * as THREE from "three";
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';

但是对于像 EVALoader.js 这样的文件。我不知道该怎么办。

我的想法是声明一个三个对象并将其导出。可以用吗?

globals.js

import * as THREE from "three";
window.THREE = THREE;
export default THREE;

然后我就可以重写EVALoader.js了

import * as THREE from "globals"

THREE.EVALoader = function(onLoad, url, options){
    // todo something
}
javascript node.js module three.js export
1个回答
0
投票

我是通过添加文件来实现的

globals.js

import * as MYTHREE from "three";

global.THREE = MYTHREE;
global.EVA= {};

console.log("start THREE", global.THREE);
console.log("start THREE", global.EVA);

export default MYTHREE;

然后导入它和其他js文件。

© www.soinside.com 2019 - 2024. All rights reserved.