最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 在打包工具(vite 为例)的环境下创建 Three.js 项目 - 掘金

    正文概述 掘金(星期天与猫)   2021-10-01   1578

    0 技术选型

    • vite 2.6 来做开发服务器、打包器
    • vanilla.js 来写 JavaScript 代码
    • css3 来控制页面样式
    • yarn 管理 Three.js 依赖

    快速开项目

    yarn create vite threejs-esm-demo --template vanilla
    cd ./threejs-esm-demo
    yarn add three # 主库
    yarn add @types/three -D # 类型提示库
    

    1 项目目录结构

    + threejs-esm-demo/
      + node_modules/...
      - index.html
      - main.js
      - style.css
      - ...
    

    2 修改 main.jsstyle.css

    main.js

    import { 
      PerspectiveCamera,
      Scene,
      BoxGeometry,
      MeshNormalMaterial,
      Mesh,
      WebGLRenderer,
    } from 'three'
    
    import './index.css'
    
    let camera
    let scene
    let renderer
    let geometry
    let material
    let mesh
    
    const init = () => {
      camera = new PerspectiveCamera(70, window.innerWidth / window.innerHeight, 0.01, 10)
      camera.position.z = 1
    
      scene = new Scene()
      
      geometry = new BoxGeometry(0.2, 0.2, 0.2)
      material = new MeshNormalMaterial()
    
      mesh = new Mesh(geometry, material)
      scene.add(mesh)
    
      renderer = new WebGLRenderer({
        antialias: true
      })
      renderer.setSize(window.innerWidth, window.innerHeight)
      renderer.setAnimationLoop(animation)
      document.querySelector('#app').appendChild(renderer.domElement)
    }
    
    const animation = (time) => {
      mesh.rotation.x = time / 2000
      mesh.rotation.y = time / 1000
      
      camera.aspect = window.innerWidth / window.innerHeight
      camera.updateProjectionMatrix()
      renderer.setSize(window.innerWidth, window.innerHeight)
    
      renderer.render(scene, camera)
    }
    
    window.addEventListener("DOMContentLoaded", () => {
      init()
    })
    

    style.css

    html, body {
      padding: 0;
      margin: 0;
    }
    
    #app {
      width: 100vw;
      height: 100vh;
    }
    

    2.3 运行

    yarn dev 即可在 http://localhost:3000/ 上查看旋转小方块的效果。

    yarn build 构建打包至项目 ./dist 目录,并使用 yarn servehttp://localhost:5000/ 上查看生产模式的效果。

    3 原理

    @types/three 这个包会告诉 VSCode 如何识别 Three.js 的命名空间、模块,也会告诉打包器如何对 three 这个包打包。

    不妨在 vite 的配置中把压缩关闭:

    import { defineConfig } from 'vite'
    
    export default defineConfig({
      build: {
        minify: false
      }
    })
    

    重新打包,你可以在 ./dist/index.<hashcode>.js 文件中的第一行找到这样的代码:

    import { P as PerspectiveCamera, S as Scene, B as BoxGeometry, M as MeshNormalMaterial, a as Mesh, W as WebGLRenderer } from "./vendor.ae523e04.js";
    

    打开这个 ./vendor.<hashcode>.js 文件,找到最后几行:

    if (typeof window !== "undefined") {
      if (window.__THREE__) {
        console.warn("WARNING: Multiple instances of Three.js being imported.");
      } else {
        window.__THREE__ = REVISION;
      }
    }
    export { BoxGeometry as B, MeshNormalMaterial as M, PerspectiveCamera as P, Scene as S, WebGLRenderer as W, Mesh as a };
    

    这就是 vite 打包器(当前暂时为 rollup)做的事情,你会发现 vendor.<hashcode>.js 的体积和官方的 Three.js 单文件库体积、内容差不了多少,其实这就是 vite 打包器根据类型库 @types/threethree 库本身打包出来的依赖项,丑是丑了点,没关系,程序能运行就行。

    3 下一步

    • 关注 Three.js 的其他插件,例如一些额外的 Loader 类如何被开发模式、生产模式的页面调用以及导入。这个留给读者自己试验;

    • 使用 CDN 加速构建过程和首屏速度。即便 gzip 后只有 100 多 KB,比起 Cesium.js 等庞然大物来说小了不少,但是作为一个有追求的开发者,应该每一步尽可能想到能优化的地方。这个可以查看 vite 的插件,令 vite 排除 three 的打包,并在 index.html 中以 <script> 的形式引入 three;

    • 在 Webpack、Parcel、Rollup 等打包器、构建工具中做尝试,适合老项目。

    源代码下载

    【微云文件】threejs-esm-demo.zip


    下载网 » 在打包工具(vite 为例)的环境下创建 Three.js 项目 - 掘金

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元