React Native跨平台鸿蒙开发高级应用原理:React Native为什么可以无缝跨平台
React Native是一个基于React的开源框架,用于构建跨平台原生移动应用。它允许开发者使用JavaScript和React组件模型开发iOS和Android应用,同时保持接近原生应用的性能和体验。核心特点包括:代码复用(一次编写多平台运行)、热更新支持、原生UI组件映射以及灵活的可扩展性。React Native提供基础核心组件(如View、Text等),并支持自定义原生组件开发。其优势
框架介绍
React Native 是一个基于 JavaScript 和 React 框架的开源框架,用于构建原生移动应用程序。它允许开发者使用 React 的组件模型和声明式编程风格来构建跨平台的移动应用。
主要特点和详细介绍:
- 跨平台性:开发者只需要编写一次代码,就可以在 iOS、Android、React Native DOM 等不同平台上运行应用程序,从而提高了开发效率和代码复用率。
- 基于 React:React Native 基于 React 框架,采用了 React 的组件模型和虚拟 DOM 技术。
- 原生应用的性能:React Native 应用程序的业务逻辑是使用 JavaScript 编写的,但它可以调用原生平台提供的 API 和使用原生 UI 组件。这使得 React Native 应用程序可以实现接近原生应用的性能和用户体验,包括流畅的滚动、快速的响应时间。
- 热更新:React Native 支持热更新,整个应用程序可以不经过重新编译直接将更新后的 JavaScript 代码推送到设备上。
- 灵活性和可扩展性:具有很高的灵活性和可扩展性,开发者可以根据自己的需求选择合适的第三方库和工具,来扩展和增强应用程序的功能。
使用 React 来创建 Android 和 iOS 的原生应用
React Native 将原生开发的最佳部分与 React 相结合, 致力于成为构建用户界面的顶尖 JavaScript 框架。
酌量添加,多少随意。随时都可以把 React Native 无缝集成到你已有的 Android 或 iOS 项目,当然也可以完全从头焕然一新地重写。
JavaScript 在手,原生我有
将 React 基础抽象组件渲染为原生平台UI组件,意味着每个视图和原生应用都别无二致。
流水的多平台,铁打的 React。绝大多数情况下,使用 React Native 的团队可以在多个平台间共享一份基础代码,以及通用的技术 —— React。

简单易开发,人人有功练
React Native 使你可以创建真正原生的应用,用户体验绝不拉胯。它提供了一些平台无关的抽象核心组件,像是View, Text 以及 Image等,可直接映射渲染为 对应平台的原生UI组件。
无缝跨平台
通过 React 的声明式组件机制和 JavaScript 代码,现有的原生代码和api可以完美地封装嵌合到 React 组件中。这样既为更多新的开发团队赋予原生应用的开发能力,也能极大地提升现有原生团队的开发效率。

核心组件与原生组件
React Native 是一个使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架。通过 React Native,您可以使用 JavaScript 来访问移动平台的 API,以及使用 React 组件来描述 UI 的外观和行为:一系列可重用、可嵌套的代码。你可以在下一节了解更多关于 React 的信息。但首先,让我们介绍一下组件在 React Native 中是如何工作的。
视图(Views)与移动开发
在 Android 和 iOS 开发中,一个视图是 UI 的基本组成部分:屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚至应用程序最小的视觉元素(例如一行文本或一个按钮)也都是各种视图。某些类型的视图可以包含其他视图。全部都是视图。

原生组件
在 Android 开发中是使用 Kotlin 或 Java 来编写视图;在 iOS 开发中是使用 Swift 或 Objective-C 来编写视图。在 React Native 中,则使用 React 组件通过 JavaScript 来调用这些视图。在运行时,React Native 为这些组件创建相应的 Android 和 iOS 视图。由于 React Native 组件就是对原生视图的封装,因此使用 React Native 编写的应用外观、感觉和性能与其他任何原生应用一样。我们将这些平台支持的组件称为原生组件。
React Native 允许您为 Android 和 iOS 构建自己的 Native Components(原生组件),以满足您开发应用程序的独特需求。我们还有一个由社区贡献的繁荣生态系统,您可以到Native Directory来查找社区已创建的内容。
React Native 还包括一组基本的,随时可用的原生组件,您可以使用它们来构建您的应用程序。这些是 React Native 的核心组件。
核心组件
React Native 具有许多核心组件,从表单控件到活动指示器,应有尽有。你可以在API 章节找到它们。您将主要使用以下核心组件:
由于 React Native 使用与 React 组件相同的 API 结构,因此您需要了解 React 组件 API 才能上手。

React 基础
React Native 的基础是React, 是在 web 端非常流行的开源 UI 框架。要想掌握 React Native,先了解 React 框架本身是非常有帮助的。本文旨在为初学者介绍一些 react 的入门知识。
本文主要会探讨以下几个 React 的核心概念:
- components 组件
- JSX
- props 属性
- state 状态
实际案例:
var __BUNDLE_START_TIME__=globalThis.nativePerformanceNow?nativePerformanceNow():Date.now(),__DEV__=true,process=globalThis.process||{},__METRO_GLOBAL_PREFIX__='',__requireCycleIgnorePatterns=[/(^|\/|\\)node_modules($|\/|\\)/];process.env=process.env||{};process.env.NODE_ENV=process.env.NODE_ENV||"development";
(function (global) {
"use strict";
global.__r = metroRequire;
global[`${__METRO_GLOBAL_PREFIX__}__d`] = define;
global.__c = clear;
global.__registerSegment = registerSegment;
var modules = clear();
var EMPTY = {};
var CYCLE_DETECTED = {};
var _ref = {},
hasOwnProperty = _ref.hasOwnProperty;
if (__DEV__) {
var _global$$RefreshReg$, _global$$RefreshSig$;
global.$RefreshReg$ = (_global$$RefreshReg$ = global.$RefreshReg$) != null ? _global$$RefreshReg$ : function () {};
global.$RefreshSig$ = (_global$$RefreshSig$ = global.$RefreshSig$) != null ? _global$$RefreshSig$ : function () {
return function (type) {
return type;
};
};
}
function clear() {
modules = new Map();
return modules;
}
if (__DEV__) {
var verboseNamesToModuleIds = new Map();
var getModuleIdForVerboseName = function getModuleIdForVerboseName(verboseName) {
var moduleId = verboseNamesToModuleIds.get(verboseName);
if (moduleId == null) {
throw new Error(`Unknown named module: "${verboseName}"`);
}
return moduleId;
};
var initializingModuleIds = [];
}
function define(factory, moduleId, dependencyMap) {
if (modules.has(moduleId)) {
if (__DEV__) {
var inverseDependencies = arguments[4];
if (inverseDependencies) {
global.__accept(moduleId, factory, dependencyMap, inverseDependencies);
}
}
return;
}
var mod = {
dependencyMap: dependencyMap,
factory: factory,
hasError: false,
importedAll: EMPTY,
importedDefault: EMPTY,
isInitialized: false,
publicModule: {
exports: {}
}
};
modules.set(moduleId, mod);
if (__DEV__) {
mod.hot = createHotReloadingObject();
var verboseName = arguments[3];
if (verboseName) {
mod.verboseName = verboseName;
verboseNamesToModuleIds.set(verboseName, moduleId);
}
}
}
function metroRequire(moduleId, maybeNameForDev) {
if (moduleId === null) {
if (__DEV__ && typeof maybeNameForDev === "string") {
throw new Error("Cannot find module '" + maybeNameForDev + "'");
}
throw new Error("Cannot find module");
}
if (__DEV__ && typeof moduleId === "string") {
var verboseName = moduleId;
moduleId = getModuleIdForVerboseName(verboseName);
console.warn(`Requiring module "${verboseName}" by name is only supported for ` + "debugging purposes and will BREAK IN PRODUCTION!");
}
var moduleIdReallyIsNumber = moduleId;
if (__DEV__) {
var initializingIndex = initializingModuleIds.indexOf(moduleIdReallyIsNumber);
if (initializingIndex !== -1) {
var cycle = initializingModuleIds.slice(initializingIndex).map(function (id) {
var _modules$get$verboseN, _modules$get;
return (_modules$get$verboseN = (_modules$get = modules.get(id)) == null ? void 0 : _modules$get.verboseName) != null ? _modules$get$verboseN : "[unknown]";
});
if (shouldPrintRequireCycle(cycle)) {
cycle.push(cycle[0]);
console.warn(`Require cycle: ${cycle.join(" -> ")}\n\n` + "Require cycles are allowed, but can result in uninitialized values. " + "Consider refactoring to remove the need for a cycle.");
}
}
}
var module = modules.get(moduleIdReallyIsNumber);
return module && module.isInitialized ? module.publicModule.exports : guardedLoadModule(moduleIdReallyIsNumber, module);
}
function shouldPrintRequireCycle(modules) {
var regExps = global[__METRO_GLOBAL_PREFIX__ + "__requireCycleIgnorePatterns"];
if (!Array.isArray(regExps)) {
return true;
}
var isIgnored = function isIgnored(module) {
return module != null && regExps.some(function (regExp) {
return regExp.test(module);
});
};
return modules.every(function (module) {
return !isIgnored(module);
});
}
function metroImportDefault(moduleId) {
if (__DEV__ && typeof moduleId === "string") {
var verboseName = moduleId;
moduleId = getModuleIdForVerboseName(verboseName);
}
var moduleIdReallyIsNumber = moduleId;
var maybeInitializedModule = modules.get(moduleIdReallyIsNumber);
if (maybeInitializedModule && maybeInitializedModule.importedDefault !== EMPTY) {
return maybeInitializedModule.importedDefault;
}
var exports = metroRequire(moduleIdReallyIsNumber);
var importedDefault = exports && exports.__esModule ? exports.default : exports;
var initializedModule = modules.get(moduleIdReallyIsNumber);
return initializedModule.importedDefault = importedDefault;
}
metroRequire.importDefault = metroImportDefault;
function metroImportAll(moduleId) {
if (__DEV__ && typeof moduleId === "string") {
var verboseName = moduleId;
moduleId = getModuleIdForVerboseName(verboseName);
}
var moduleIdReallyIsNumber = moduleId;
var maybeInitializedModule = modules.get(moduleIdReallyIsNumber);
if (maybeInitializedModule && maybeInitializedModule.importedAll !== EMPTY) {
return maybeInitializedModule.importedAll;
}
var exports = metroRequire(moduleIdReallyIsNumber);
var importedAll;
if (exports && exports.__esModule) {
importedAll = exports;
} else {
importedAll = {};
if (exports) {
for (var key in exports) {
if (hasOwnProperty.call(exports, key)) {
importedAll[key] = exports[key];
}
}
}
importedAll.default = exports;
}
var initializedModule = modules.get(moduleIdReallyIsNumber);
return initializedModule.importedAll = importedAll;
}
打包
接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。

打包之后再将打包后的鸿蒙OpenHarmony文件拷贝到鸿蒙的DevEco-Studio工程目录去:


欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。
更多推荐


所有评论(0)