ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

React 360 CLI 使用与生成器机制完全指南:用 `react-360 init` 一键创建 360° 项目

React 360 CLI 使用与生成器机制完全指南:用 `react-360 init` 一键创建 360° 项目 前端3D渲染【免费下载链接】react-360Create amazing 360 and VR content using React项目地址https://gitcode.com/gh_mirrors/re/react-360点击查看免费下载本指南围绕 React 360 官方脚手架工具react-360-cli展开讲解其安装方式、init命令的完整执行流程、生成项目的每个文件作用以及驱动整个脚手架的核心「生成器Generators」机制。读完本文你将不仅能熟练使用 CLI 创建 360° 应用还能理解其内部实现原理并可以自定义生成器来扩展自己的脚手架。React 360 的双包架构运行时与 CLIReact 360 以两个独立 npm 包的形式分发职责划分非常清晰react-360包含构建交互式 360° 应用所需的全部运行时代码React 组件、渲染合成器、相机控制、音频视频模块等作为项目依赖安装。本仓库中的核心实现在 React360/js 目录对外 API 入口为 React360/React360.js。react-360-cli命令行脚手架工具应全局安装npm install -g react-360-cli用于快速初始化 React 360 项目。它的全部源码位于 addons/react-360-cli即本文的主角。从 CLI 的 package.json 可以看到它的关键元信息包名为react-360-cli版本0.1.0通过bin: {react-360: index.js}把可执行命令暴露为全局的react-360运行时仅依赖chalk用于终端彩色输出并要求 Node.js 版本 6。快速开始从零创建一个 React 360 项目第一步全局安装 CLInpm install -g react-360-cli安装完成后命令行中即出现react-360命令。由于index.js首行带有#!/usr/bin/env nodeshebang见 index.jsnpm 会将其作为可执行脚本链接到全局 bin 目录。第二步初始化项目react-360 init MyProject该命令会在当前目录下创建名为MyProject的新项目目录生成 React 360 起步所需的所有文件自动运行npm install若检测到 yarn 则改用 yarn拉取项目依赖。第三步启动开发cd MyProject npm startnpm start实际执行的是node node_modules/react-360/scripts/packager.js见生成的 package.json即启动 Metro 打包器。启动完成后浏览器访问http://localhost:8081/index.html即可预览应用直接编辑index.js即可开始修改应用内容。init命令的完整执行流程源码级解析CLI 入口 index.js 是整个流程的总指挥它依次完成以下阶段阶段间以 Promise 链串接1. 版本自检启动时getLatestVersion()实现见 src/getLatestVersion.js会先通过npm config get registry或yarn config get registry读取当前 registry 地址再向{registry}react-360-cli/latest发起 HTTPS 请求获取最新版本号。若本地版本落后于最新版本会以红色提示并给出升级命令使用 yarn 时yarn global upgrade react-360-cli使用 npm 时npm update -g react-360-cli版本检查的所有异常网络失败、解析失败等都会被静默吞掉resolve null不影响主流程执行。2. 命令分发与参数校验无参数或传入--help时打印用法并退出仅支持init子命令其他命令会输出Unsupported command:并打印用法init缺项目名时打印用法退出。3. 项目名校验两道防线CLI 对项目名执行了严格的双重校验// 第一道非法字符正则 if (rawName.match(/[~!#%^*();:{}\[\]\/.,]/)) { ... } // 第二道必须是合法 JS 变量名用于 eval 校验并把 -、空白替换为 _ const name rawName.replace(/[-\s]/g, _); eval(const ${name} null);第一道防线拦截 shell 特殊字符与标点第二道防线把MyProject这类名称规范化为合法 JS 标识符如my-project会变成my_project因为生成的项目名会被嵌入index.js中作为 React 组件类名与注册名见下文。4. 目标目录检查与创建CLI 检查当前工作目录下是否已存在同名文件/目录若存在则报错退出A directory/file named ... already exists否则调用fs.mkdirSync(dest)创建项目目录。5. 生成项目文件调用generateFiles(source, dest, {name})实现见 src/generateFiles.js把generators目录中的模板全部渲染到项目目录并额外创建空的.watchmanconfig文件fs.closeSync(fs.openSync(...))。6. 复制静态资源copyAssets(binDir, dest)实现见 src/copyAssets.js会把 CLI 包内置的 static_assets 目录内含默认的 360° 全景图360_world.jpg原样复制到新项目的static_assets/下。7. 自动安装依赖getPackager()实现见 src/getPackager.js先探测环境尝试执行yarn --versionWindows 下输出重定向到 NUL成功则选择 yarn否则回退到 npm。随后以cwd: dest方式 spawn 依赖安装进程Windows 下使用yarn.cmd/npm.cmdconst cmd cmdName yarn ? child_process.spawn(/^win/.test(process.platform) ? yarn.cmd : yarn, {...}) : child_process.spawn(/^win/.test(process.platform) ? npm.cmd : npm, [install], {...});安装进程退出码非 0 时会提示手动在项目目录内重跑该命令。8. 完成提示全部成功后终端输出进入项目的后续操作指引Now enter the new project directory by running cd MyProject Run npm start to initialize the development server From there, browse to http://localhost:8081/index.html Open index.js to begin editing your app.生成的项目结构每个文件都从哪来、干什么react-360 init生成的项目由 generators 目录下的模板模块逐一生成。下表列出全部生成文件及其模板来源生成文件模板来源作用index.jsindex.generator.jsReact 应用入口定义名为项目名的组件注册到AppRegistryclient.jsclient.generator.js运行时初始化创建ReactInstance、渲染到默认曲面、加载背景index.htmlindex.html.generator.js页面骨架加载 bundle 并调用React360.initpackage.jsonpackage.json.generator.js项目依赖与 npm scripts.babelrcbabelrc.generator.jsBabel 配置preset 为react-native.flowconfigflowconfig.generator.jsFlow 类型检查配置.gitignoregitignore.generator.jsGit 忽略规则.watchmanconfigwatchmanconfig.generator.jsWatchman 文件监听配置{}rn-cli.config.jsrn-cli.config.generator.jsMetro 打包器配置static_assets/360_world.jpgstatic_assets默认 360° 背景图由 copyAssets 复制index-test.jstests/index-test.generator.jsJest 冒烟测试应用入口index.js模板把项目名注入两处组件类名与注册名。export default class ${config.name} extends React.Component { render() { return ( View style{styles.panel} View style{styles.greetingBox} Text style{styles.greeting}Welcome to React 360/Text /View /View ); } }; AppRegistry.registerComponent(${config.name}, () ${config.name});默认 UI 是一个 1000×600 的半透明白色面板rgba(255, 255, 255, 0.4)内嵌黑底蓝边的问候框字体 30 号。这些样式均通过StyleSheet.create定义。运行时初始化client.jsimport {ReactInstance} from react-360-web; function init(bundle, parent, options {}) { const r360 new ReactInstance(bundle, parent, { fullScreen: true, ...options, }); r360.renderToSurface( r360.createRoot(${config.name}, { /* initial props */ }), r360.getDefaultSurface() ); r360.compositor.setBackground(r360.getAssetURL(360_world.jpg)); } window.React360 {init};其中fullScreen: true表示默认全屏渲染renderToSurface将根组件渲染到默认圆柱曲面Cylinder SurfacesetBackground加载360_world.jpg作为 360° 环境背景。ReactInstance的完整实现可参考 React360/js/ReactInstance.js。页面骨架index.htmldiv idcontainer/div script src./client.bundle?platformvr/script script React360.init( index.bundle?platformvrdevtrue, document.getElementById(container), { bridgeFile: NonBlobBridge.js, assetRoot: static_assets/, } ); /script注意platformvr参数与bridgeFile: NonBlobBridge.js对应运行时 React360/js/Executor/NonBlobBridge.js以及assetRoot指向static_assets/目录。项目package.json生成的项目依赖固定版本组合react16.3.2、react-native~0.55.4、three^0.87.0、react-360~1.1.0、react-360-web~1.1.0devDependencies 包含jest、babel-jest、react-devtools、xopen等。scripts 一览{ start: node node_modules/react-360/scripts/packager.js, bundle: node node_modules/react-360/scripts/bundle.js, open: node -e \require(xopen)(http://localhost:8081/index.html)\, devtools: react-devtools, test: jest }其中bundle脚本对应仓库 scripts/bundle.jsstart对应 scripts/packager.jstest使用jestpreset 为react-360配合index-test.js做渲染冒烟测试。Metro 打包器配置rn-cli.config.jsgetAssetExts() { return [obj, mtl]; }, // 识别 3D 模型资产扩展名 getPlatforms() { return [vr]; }, // 注册 vr 平台 getProvidesModuleNodeModules() { return [react-native, react-360]; },这是 React 360 项目区别于普通 React Native 项目的关键配置声明vr平台与.obj/.mtl资产类型正是index.html中platformvr能生效的底层原因。Generators 机制脚手架的核心抽象README 的核心章节介绍了这一机制React 360 CLI 依据generators目录下的文件来生成起始项目。这些文件是极简的 JavaScript 模块从字符串模板产出文件。配置变量可从 CLI 传入生成器生成器返回一个包含两个键的对象filename要创建的文件名content源码中实际读取的是contents字段文件内容。两者组合后在生成器所在目录的相对位置创建文件。例如位于generators/subdir的生成器会在$PROJECT_DIRECTORY/subdir/产出文件。注意源码 generateFiles.js 中读取的是fileData.contents且会额外回填fileData.path记录生成器相对目录。接口约定每个生成器模块导出形如module.exports config ({filename, contents})的函数其中config即 CLI 注入的配置对象。init命令注入的配置是{name}规范化后的项目名。例如 index.generator.js 用${config.name}作为类名与注册名package.json.generator.js 用${config.name}作为包名。生成器的递归发现listGenerators.js 负责递归遍历generators目录对每个条目用fs.stat判断是目录还是文件实现见 isDirectory.js目录则递归下降并拼接相对路径文件则记录其所在目录路径。这样generators/__tests__/index-test.generator.js就会在项目的__tests__/目录下产出index-test.js。文件落盘generateFiles.js 把发现的所有生成器一次性require通过 makeModulePath.js 把相对路径转成可解析的模块路径调用gen(config)得到{filename, contents, path}再交给createFiles并行执行 createFile.js后者先用 ensureDir.js 同步创建目标目录避免并发冲突再fs.writeFile写入path.join(dest, file.path, file.filename)。编写自定义生成器的示例以新增一个README.md模板为例在generators/下新建readme.generator.jsmodule.exports config ({ filename: README.md, contents: # ${config.name} This project was generated by react-360-cli. , });由于生成器是递归发现的普通 JS 模块重新运行react-360 init后新项目根目录就会自动出现README.md。这正是「配置变量 字符串模板 递归目录发现」这套极简抽象带来的可扩展性。底层辅助工具一览CLI 的src/目录还包含若干支撑模块理解它们有助于深度定制模块职责createFile.js建目录 写文件ensureDir.js同步确保目录存在listGenerators.js递归枚举生成器isDirectory.js判断条目是否为目录makeModulePath.js路径转可加载模块路径generateFiles.js编排生成流程copyAssets.js / copyFile.js流式复制静态资产fs.createReadStream().pipe()getLatestVersion.js检查 npm registry 最新版本getPackager.js探测 yarn / npm测试与质量保障生成的项目自带一个 Jest 冒烟测试index-test.js模板见tests/index-test.generator.js通过react-test-renderer渲染../index.js导出的根组件来验证应用能否正常挂载import Index from ../index.js; import renderer from react-test-renderer; it(renders correctly, () { const tree renderer.create(Index /); });项目内运行npm test即可执行。仓库根目录的 jest.config.js 与 babel.config.js 则配置了 CLI 本身及其余子包的测试环境。常见问题与注意事项项目名规范避免使用~!#%^*();:{}[]/.,等字符-与空白会被自动替换为_项目名必须是合法 JS 标识符否则 CLI 拒绝创建。同名冲突当前目录下已存在同名文件或目录时CLI 直接退出不会覆盖任何内容。依赖安装失败CLI 只负责触发安装若npm install/yarn中途失败进入项目目录手动重跑即可不会影响已生成的文件。版本提示CLI 每次启动都会静默检查最新版本发现落后时给出升级命令网络异常时该检查自动跳过。平台参数index.html中的platformvr与rn-cli.config.js中声明的vr平台必须保持一致这是 Metro 正确打包 React 360 应用的前提。Node 版本CLI 自身要求 Node 6但运行时依赖react 16.3.2、react-360 1.1.0 等对现代 Node 环境建议按实际开发环境验证。通过本文你不仅掌握了react-360 init的完整使用链路也深入理解了其「生成器 配置注入」的脚手架内核——这套设计让模板维护与项目初始化解耦是值得在自有工具链中借鉴的轻量方案。更深入的内容可继续阅读仓库中的 setup.md、example-basicapptemplate.md 与 what-is.md 了解 React 360 的整体概念与示例模板。赞分享前端3D渲染【免费下载链接】react-360Create amazing 360 and VR content using React项目地址https://gitcode.com/gh_mirrors/re/react-360点击查看免费下载相关推荐KeyPass加密备份与恢复全攻略3步打造你的密码安全防线KeyPass加密备份与恢复全攻略3步打造你的密码安全防线 在数字时代密码安全至关重要而KeyPass作为一款开源离线密码管理器为用户提供了强大的加密备前端3D渲染RPFM6大功能模块深度解析全面战争MOD开发的终极效率工具RPFM6大功能模块深度解析全面战争MOD开发的终极效率工具 你是否曾经面对《全面战争》庞大的游戏数据感到无从下手是否在传统MOD工具中经历了漫长的加载等前端3D渲染OpenReel Video Monorepo开发流实践pnpm workspaces、WASM构建与多包测试体系OpenReel Video Monorepo开发流实践pnpm workspaces、WASM构建与多包测试体系 OpenReel Video 是一个专业级音视频前端桌面应用上一篇React Native MMKV Web支持终极指南跨平台存储解决方案的完整实现下一篇【亲测免费】 工作性价比计算器开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表