Installation.html 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="utf-8">
  5. <base href="../../../" />
  6. <script src="page.js"></script>
  7. <link type="text/css" rel="stylesheet" href="page.css" />
  8. </head>
  9. <body>
  10. <h1>安装([name])</h1>
  11. <p>
  12. 你可以使用[link:https://www.npmjs.com/ npm]以及现代构建工具来安装 three.js ,也可以只需静态主机或是 CDN 来快速上手。对于大多数用户来说,从 npm 安装是最佳选择。
  13. </p>
  14. <p>
  15. 无论你选择哪种方式,请始终保持一致,并注意从相同版本的库中导入所有文件。混合不同来源的文件可能会导致包含重复代码,甚至会以意料之外的方式破坏应用程序,
  16. </p>
  17. <p>
  18. 所有安装 three.js 的方式都依赖于 ES modules(参见 [link:https://eloquentjavascript.net/10_modules.html#h_hF2FmOVxw7 Eloquent JavaScript: ECMAScript Modules])。ES modules使你能够在最终项目中包含所需库的一小部分。
  19. </p>
  20. <h2>安装自 npm</h2>
  21. <p>
  22. 要安装[link:https://www.npmjs.com/package/three three] 的 npm 模块,请在你的项目文件夹里打开终端窗口,并运行:
  23. </p>
  24. <code>
  25. npm install three
  26. </code>
  27. <p>
  28. 包将会被下载并安装。然后你就可以将它导入你的代码了:
  29. </p>
  30. <code>
  31. // 方式 1: 导入整个 three.js核心库
  32. import * as THREE from 'three';
  33. const scene = new THREE.Scene();
  34. // 方式 2: 仅导入你所需要的部分
  35. import { Scene } from 'three';
  36. const scene = new Scene();
  37. </code>
  38. <p>
  39. 从npm上进行安装的时候,几乎总是使用某种构建工具([link:https://eloquentjavascript.net/10_modules.html#h_zWTXAU93DC bundling tool])来将你项目中需要的所有包组合到一个独立的JavaScript软件中。虽然任何现代的 JavaScript 打包器都可以和 three.js 一起使用,但最流行的选择是 [link:https://webpack.js.org/ webpack] 。
  40. </p>
  41. <p>
  42. 并非所有功能都可以通过 <em>three</em> 模块来直接访问(也称为“裸导入”)。three.js 中其它较为流行的部分 —— 如控制器(control)、加载器(loader)以及后期处理效果(post-processing effect) —— 必须从 [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm examples/jsm] 子目录下导入。了解更多信息,请参阅下方的<em>示例</em>。
  43. </p>
  44. <p>
  45. 你可以从 [link:https://eloquentjavascript.net/20_node.html#h_J6hW/SmL/a Eloquent JavaScript: Installing with npm] 来了解更多有关 npm 模块的信息。
  46. </p>
  47. <h2>从CDN或静态主机安装</h2>
  48. <p>
  49. 通过将文件上传到你自己的服务器,或是使用一个已存在的CDN,three.js 便可以不借助任何构建系统来进行使用。由于 three.js 依赖于ES module,因此任何引用它的script标签必须使用<em>type="module"</em>。如下所示:
  50. </p>
  51. <code>
  52. &lt;script type="importmap">
  53. {
  54. "imports": {
  55. "three": "https://unpkg.com/three@&lt;version&gt;/build/three.module.js"
  56. }
  57. }
  58. &lt;/script>
  59. &lt;script type="module">
  60. import * as THREE from 'three';
  61. const scene = new THREE.Scene();
  62. &lt;/script>
  63. </code>
  64. <h2>Addons</h2>
  65. <p>
  66. three.js的核心专注于3D引擎最重要的组件。其它很多有用的组件 —— 如控制器(control)、加载器(loader)以及后期处理效果(post-processing effect) —— 是 [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm examples/jsm] 目录的一部分。它们被称为“示例”,虽然你可以直接将它们拿来使用,但它们也需要重新混合以及定制。这些组件和 three.js 的核心保持同步,而 npm 上类似的第三方包则由不同的作者进行维护,可能不是最新的。
  67. </p>
  68. <p>
  69. 示例无需被单独地<em>安装</em>,但需要被单独地<em>导入</em>。如果 three.js 是使用 npm 来安装的,你可以使用如下代码来加载轨道控制器([page:OrbitControls]):
  70. </p>
  71. <code>
  72. import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  73. const controls = new OrbitControls( camera, renderer.domElement );
  74. </code>
  75. <p>
  76. 如果 three.js 安装自一个 CDN ,请使用相同的 CDN 来安装其他组件:
  77. </p>
  78. <code>
  79. &lt;script type="importmap">
  80. {
  81. "imports": {
  82. "three": "https://unpkg.com/three@&lt;version&gt;/build/three.module.js",
  83. "three/addons/": "https://unpkg.com/three@&lt;version&gt;/examples/jsm/"
  84. }
  85. }
  86. &lt;/script>
  87. &lt;script type="module">
  88. import * as THREE from 'three';
  89. import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  90. const controls = new OrbitControls( camera, renderer.domElement );
  91. &lt;/script>
  92. </code>
  93. <p>
  94. 所有文件使用相同版本是十分重要的。请勿从不同版本导入不同的示例,也不要使用与 three.js 本身版本不一致的示例。
  95. </p>
  96. <h2>兼容性</h2>
  97. <h3>CommonJS 导入</h3>
  98. <p>
  99. 虽然现代的 JavaScript 打包器已经默认支持ES module,然而也有一些较旧的构建工具并不支持。对于这些情况,你或许可以对这些打包器进行配置,让它们能够理解 ES module 。例如,[link:http://browserify.org/ Browserify] 仅需 [link:https://github.com/babel/babelify babelify] 插件。
  100. </p>
  101. <h3>Import maps</h3>
  102. <p>
  103. 和从静态主机或CDN来进行安装的方式相比,从npm安装时,导入的路径有所不同。我们意识到,对于使用两种不同方式的用户群体来说,这是一个人体工程学问题。使用构建工具与打包器的开发者更喜欢仅使用单独的包说明符(如'three')而非相对路径,而<em>examples/</em>目录中的文件使用相对于 <em>three.module.js</em> 的引用并不符合这一期望。对于不使用构建工具的人(用于快速原型、学习或个人参考)来说,或许也会很反感这些相对导入。这些相对导入需要确定目录结构,并且比全局 <em>THREE.*</em> 命名空间更不宽容。
  104. </p>
  105. <p>
  106. 我们希望在 [link:https://github.com/WICG/import-maps import maps] 广泛可用时,能够移除这些相对路径,将它们替换为单独的包说明符,'three'。这更加符合构建工具对npm包的期望,且使得两种用户群体在导入文件时能够编写完全相同的代码。对于更偏向于避免使用构建工具的用户来说,一个简单的 JSON 映射即可将所有的导入都定向到一个 CDN 或是静态文件夹。通过实验,目前你可以通过一个 import map 的 polyfill,来尝试更简洁的导入,如 [link:https://glitch.com/edit/#!/three-import-map?path=index.html import map example] 示例中所示。
  107. </p>
  108. <h3>Node.js</h3>
  109. <p>
  110. 由于 three.js 是为 Web 构建的, 因此它依赖于浏览器和 DOM 的 API ,但这些 API 在 Node.js 里不一定存在。这些问题中有的可以使用 [link:https://github.com/stackgl/headless-gl headless-gl] 等 shims 来解决,或者用自定义的替代方案来替换像 [page:TextureLoader] 这样的组件。其他 DOM API 可能与使用它们的代码强相关,因此将更难以解决。我们欢迎简单且易于维护的 pull request 来改进对 Node.js 的支持,但建议先打开问题来讨论您的改进。
  111. </p>
  112. <p>
  113. 确保在您的 package.json 文件中添加 { "type": "module" },以在您的 Node.js 项目中启用 ES6 模块。
  114. </p>
  115. </body>
  116. </html>