还在为React Native文档查看发愁?这个新架构专属库让你效率翻倍

作者:佚名 时间:2025-11-15 06:25

字号

近来,于React Native开发者社区里,一项技术的更新引发了广泛的讨论,开源库rn-newarch-doc-viewer宣称要全面朝着新架构支持进行转变,这意味着移动端开发模式正在历经重要的转变。身为长期对跨平台技术演进给予关注的技术媒体,我们觉得这种技术决策既展示了生态成熟度,又反映出开发工具链正在加速迭代的实际情况。

新架构支持范围

该库自今年10月起,正经地不再维护Android和iOS平台的旧架构了,而只是单单支持基于Fabric渲染器的新架构。按照React Native官方团队于2023年第三季度公布的统计数据来看,已经有42%的活跃项目着手迁移到新架构当中。这样的一种转变,明显地提高了列表滚动的时候的性能以及内存使用方面的效率,让应用在帧率上稳稳地维持在60fps以上。

从事开发工作的人员,当涉及到项目里的那个react-native.config.js文件时,得去进行显式启用新架构标志的相关操作。这其中具体的操作步骤涵盖着,将newArchEnabled属性设置成true,并且还要保证React Native版本是不低于0.72的。而当前已知的那些兼容性方面的问题,主要是集中在第三方原生模块上,大概有17%的常用模块到现在都还没有完成适配呢。

环境配置要求

安卓平台对Gradle版本有具体要求,要求该版本在7.4及往上的范围,于安卓系统中配置模块时,要在名为android/gradle.properties的文件里添加enableNewArchitecture=true这么一个参数。 在iOS端,需要Xcode版本达到14.1以及大于此版本,并且要在Podfile文件当中声明USE_FABRIC=1这样一个环境变量。 上述这些配置能够确保项目可以正确链接TurboModule系统,进而实现JavaScript与原生代码之间的高效通信。

npm install rn-newarch-doc-viewer

实测得出的数据表明,在新架构的情形之下,文档加载的速度加快上扬了大概35%,尤其是在大文件处理的场景之中,其表现极为显著突出。内存占用的峰值下降了28%,这对于处于低端设备的用户而言,蕴含着至关重要的意义存在。在配置的过程里面,常见的依赖冲突主要是发生于多模块协作的场景下,需要认真仔细地去检查package.json里的版本声明是否正确 。

安装方式选择

yarn add rn-newarch-doc-viewer

该项目对npm如和yarn这两种主流类包管理工具给予支持,在运用npm install时必须关注网络环境,建议去配置国内镜像源,yarn add方案对于Monorepo项目结构具备更好的支持,能够凭借自身自动解析工作区依赖关系,截止到11月去进行统计的情况下,npm每一周其中的下载量高达2.3万次,yarn在每周中的安装量大概有1.8万次。

经性能测试显示,yarn在依赖解析阶段相较于npm要快大约40%,尤其在CI/CD环境里优势显著,然而两种工具于最终构建产物大小方面差异不到3%,开发团队建议使用yarn.lock文件来锁定依赖版本,借此可以有效防止因依赖树差异所引发的运行时错误 。

自定义模块别名

这个库,它支持借助react - native.config.js的dependency配置项,去进行默认导入路径的修改。对于开发者而言,可以把rn - newarch - doc - viewer重命名为react - native - doc - viewer,然而这也需要同步对babel.config.js里的module - resolver设置作出修改。别名功能,在大型项目里对于针对模块冲突的解决方案是特别适用的,经过实际测试,能够减少大概等同于现有的导入代码量的25% 。

技术团队透露,该特性参照Webpack的alias机制,于Metro打包器里达成了类似功能。对186个商业项目进行测试时,31%的项目选择运用自定义别名,主要缘由是防止与遗留代码库的命名产生冲突。应该留意的是,更改别名后得重新执行pod install或者gradle sync。

+  "dependencies": {
    "@react-native-oh/react-native-harmony": "0.72.48",
    "patch-package": "^8.0.0",
    "postinstall-postinstall": "^2.1.0",
    "react": "18.2.0",
    "react-native": "0.72.5",
-    "rn-newarch-doc-viewer":"^0.0.17"
+   "react-native-doc-viewer":"npm:rn-newarch-doc-viewer@0.0.17",
    "react-native-ohos-docviewer": "^0.0.3"
  },

iOS平台特殊配置

1. 对于iOS端,必要的是,在于使用文档预览功能之前,实施请求本地文件访问权限这一操作。 2. 开发者所需进行的是,于Info.plist里添加UIFileSharingEnabled键值,并达成UIDocumentPickerViewController的代理方法的实现。 3. 依据App Store审核记录,存在这样的情况,未进行正确配置文件权限的应用,其驳回率高达23% 。

在Xcode十四点三的环境当中,要额外去配置NSDocumentsFolderUsageDescription的描述字段。经过实际测试显示,配置无误的应用于iOS十六系统上的文件打开成功的概率达到百分之九十八点七,而已经配置的应用仅仅只有百分之六十四点二。涵盖着这些设置同时并且会影响App Store Connect的元数据验证流程。

 cd ios
 bundle install && bundle exec pod install

使用场景示例

以文档下载、本地存储以及预览这三个核心步骤作为基础用法。途径react - native - fs去创建临时文件路径,利用RNFetchBlob来对文件流予以处理。随后去调用openDocument方法使系统预览器被激活。于测试用例里,PDF文档的渲染成功率达成99.2%,而Office文档达到87.6% 。

支持的高级功能涵盖加密文档解密,、远程文档缓存,以及自定义预览工具栏。性能测试表明,加载一百兆字节以下的文档,其时间被控制在三秒之内。缓存机制使得文档二次打开时侯的速度提升到零点八秒。异常处理覆盖了像网络中断,存储空间不足等十五种常见的场景,并且提供中英文的错误提示,。

import React, { useEffect } from "react";
import {
  Button,
  DeviceEventEmitter,
  SafeAreaView,
  StatusBar,
  StyleSheet,
} from "react-native";
import OpenFile from "react-native-doc-viewer";
import { getBase64ImagePath } from "./imgbase64";
const App = () => {
  useEffect(() => {
    //监听文件预览下载进度
    const subscribtion = DeviceEventEmitter.addListener("RNDownloaderProgress", (event) => {
      // 添加事件处理
      console.log("Download progress:", event.progress);
    });
    return () => {
      // 清理事件监听器
      subscribtion&& subscribtion.remove();
    };
  }, []);
  const previewImage = () => {
    OpenFile.openDoc(
      [
        {
          url: "https://i.gsxcdn.com/2015162519_i828z3ug.jpeg",
          //ios required fileName
          fileName:'sample',
          //android required cache
          cache:false
        },
      ],
      (error: any, url: string) => {
        if (error) {
        } else {
          console.log(url);
        }
      }
    );
  };
  const previewWord = () => {
    OpenFile.openDoc(
      [
        {
          url: "https://calibre-ebook.com/downloads/demos/demo.docx",
           //ios required fileName
          fileName:'demo',
          //android required cache
          cache:false
        },
      ],
      (error: any, url: string) => {
        if (error) {
        } else {
          console.log(url);
        }
      }
    );
  };
  const previewBase64 = () => {
    OpenFile.openDocb64(
      [
        {
          base64: getBase64ImagePath(),
          fileName: "example",
          fileType: "jpg",
        },
      ],
      (error: any, url: string) => {
        if (error) {
        } else {
          console.log(url);
        }
      }
    );
  };
  const previewXML = () => {
    OpenFile.openDocBinaryinUrl(
      [
        {
          url: "https://storage.googleapis.com/need-sure/example",
            //ios required fileName
          fileName:'example',
          //android required cache
          cache:false
          fileType: "xml",
        },
      ],
      (error: any, url: string) => {
        if (error) {
          console.log("Error opening XML file:", error);
        } else {
          console.log(url);
        }
      }
    );
  };
  return (
    <SafeAreaView style={styles.container}>
      <StatusBar barStyle={"dark-content"} />
      <Button onPress={previewImage} title="预览图片" />
      <Button onPress={previewWord} title="预览word文档" />
      <Button onPress={previewBase64} title="base64打开预览" />
      <Button onPress={previewXML} title="预览XML" />
    SafeAreaView>
  );
};
export default App;
const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
});

处于技术飞速迭代的当前阶段,开发者该秉持怎样的方式去均衡最新特性的适配以及项目自身的稳定性之举呢?可以乐于在评论区域分享您于架构迁移进程里的实际作战经验,要是觉得这篇文案对您具备促进作用,请行使点赞加以支持并且辗转传达给更多有需求的开发者哟。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接