这段代码 import * as THREE from 'three';
是 JavaScript(或 TypeScript)中的模块导入语法,具体解析如下:
1. 引入的是什么?
'three'
指的是 Three.js 库,一个流行的 WebGL 3D 图形库。THREE
是一个命名空间对象,它将three
模块的所有导出内容(类、函数、常量等)绑定到一个变量上。例如:const scene = new THREE.Scene(); // 使用 THREE 命名空间下的 Scene 类
2. 为什么没有 .js
后缀?
这是由现代 JavaScript/TypeScript 的模块解析规则决定的:
Node.js/打包工具的支持:
当导入路径不带后缀(如'three'
)时,工具链(Webpack、Rollup、Vite、ES Modules 等)会按以下顺序尝试解析:<package-name>
→ 优先查找node_modules/three/package.json
中指定的入口文件(通常是main
或module
字段)。<package-name>.js
→ 补全.js
后缀。<package-name>/index.js
→ 查找目录下的index.js
。
npm包的约定:
大多数 npm 包(如three
)的入口文件已在package.json
中声明,因此无需手动写后缀。直接写包名即可。
3. Three.js的模块化设计
Three.js 从较新版本开始支持 ES Modules(ESM),因此可以通过以下方式导入:
// ESM方式(推荐)
import * as THREE from 'three';
// OR:按需导入(tree-shaking优化)
import { Scene, PerspectiveCamera } from 'three';
而传统全局变量方式的 <script>
引入已逐渐被淘汰:
<!--旧版全局变量方式 -->
<script src="path/to/three.min.js"></script>
<script>
const scene = new THREE.Scene();
</script>
总结
- 无后缀:是 Node.js/npm/打包工具的标准化行为。
- THREE:Three.js导出的命名空间对象。
- 现代前端工程中,通常省略后缀以保持简洁性和工具链的自动解析能力。
内容由零声教学AI助手提供,问题来源于学员提问