RN 鴻蒙混合開發實踐(踩坑)

#三方框架# #React Native #

1 。環境配置;

安裝 DevEco 開發工具;

Node 版本16+;

hdc環境配置

hdc 是 OpenHarmony 為開發人員提供的用于調試的命令行工具,鴻蒙 React Native 工程使用 hdc 進行真機調試。hdc 工具通過 OpenHarmony SDK 獲取,存放于 SDK 的?toolchains?目錄下,請將?{DevEco Studio安裝路徑}/sdk/{SDK版本}/openharmony/toolchains?的完整路徑添加到環境變量中。

安裝 DevEco 的時候 勾選一下。就不用單獨的添加環境變量了 。

配置 CAPI 版本環境變量

當前RN框架提供的 Demo 工程默認為 CAPI 版本,您需要配置環境變量?RNOH_C_API_ARCH = 1

  • Windows 環境:

    此電腦 > 屬性 > 高級系統設置 > 高級 > 環境變量中,在系統變量中點擊新建,添加變量名為:RNOH_C_API_ARCH,變量值為?1

2,創建RN 工程

使用 React Native 內置的命令行工具來創建一個名為 “AwesomeProject” 的新項目。這個命令行工具不需要安裝,可以直接用 node 自帶的 npx 命令來創建,目前 React Native for OpenHarmony 僅支持?0.72.5?版本的 React Native:

npx react-native@0.72.5 init AwesomeProject --version 0.72.5

?該命令在 mac 環境下初始化 React Native 項目時會下載 iOS 依賴庫,耗時較長,開發者可以選擇執行以下命令跳過該過程,后續根據需要自行下載,不影響鴻蒙項目開發:

npx react-native@0.72.5 init AwesomeProject --version 0.72.5 --skip-install

安裝鴻蒙化依賴

  1. 打開?AwesomeProject?目錄下的?package.json,在?scripts?下新增 OpenHarmony 的依賴:

    {"name": "AwesomeProject","version": "0.0.1","private": true,"scripts": {"android": "react-native run-android","ios": "react-native run-ios","lint": "eslint .","start": "react-native start","test": "jest",
    +    "dev": "react-native bundle-harmony --dev"},"dependencies": {"react": "18.2.0","react-native": "0.72.5"},"devDependencies": {"@babel/core": "^7.20.0","@babel/preset-env": "^7.20.0","@babel/runtime": "^7.20.0","@react-native/eslint-config": "^0.72.2","@react-native/metro-config": "^0.72.11","@tsconfig/react-native": "^3.0.0","@types/react": "^18.0.24","@types/react-test-renderer": "^18.0.0","babel-jest": "^29.2.1","eslint": "^8.19.0","jest": "^29.2.1","metro-react-native-babel-preset": "0.76.8","prettier": "^2.4.1","react-test-renderer": "18.2.0","typescript": "4.8.4"},"engines": {"node": ">=16"}
    }
    
  2. 在?AwesomeProject?目錄下運行安裝依賴包命令:

    npm i @react-native-oh/react-native-harmony@x.x.x
    

    注意:

    1. 指令中@x.x.x用于指定下載的版本,不指定時默認下載最新版本。
    2. 本地安裝鴻蒙化依賴,請參考如何使用本地安裝鴻蒙化依賴。
    3. 如何從本地依賴切換至遠程依賴,請參考如何從本地依賴切換至遠程依賴。

生成bundle

  1. 打開?AwsomeProject\metro.config.js,并添加 OpenHarmony 的適配代碼。配置文件的詳細介紹,可以參考React Native 中文網。修改完成后的文件內容如下:

    const {mergeConfig, getDefaultConfig} = require('@react-native/metro-config');
    const {createHarmonyMetroConfig} = require('@react-native-oh/react-native-harmony/metro.config');/**
    * @type {import("metro-config").ConfigT}
    */
    const config = {transformer: {getTransformOptions: async () => ({transform: {experimentalImportSupport: false,inlineRequires: true,},}),},
    };module.exports = mergeConfig(getDefaultConfig(__dirname), createHarmonyMetroConfig({reactNativeHarmonyPackageName: '@react-native-oh/react-native-harmony',
    }), config);
    
  2. 在 AwesomeProject 目錄下運行生成 bundle 文件的命令。運行成功后,會在?AwesomeProject/harmony/entry/src/main/resources/rawfile?目錄下生成?bundle.harmony.js?和?assets?文件夾,assets?用來存放圖片(如果?bundle?中不涉及本地圖片,則沒有?assets?文件夾)。

    npm run dev
    

成功之后可以看到如下內容:

創建鴻蒙工程

本章節主要介紹了鴻蒙工程的創建,并加載 React Native 相關的依賴包和 bundle 包,最終完成鴻蒙工程的運行的過程。

您可以按照本節中的操作一步一步完成環境的搭建,也可以使用附件中的?MyApplicationReplace.zip?的內容,一一替換對應的文件,修改版本并運行。

新建工程或者在已有工程中集成

? 下面演示在新建工程中集成。點擊?File > New > Create Project,選擇創建?Empty Ability?工程,如圖所示:

? 點擊?Next?按鈕,并在?Compile SDK?中選擇?API13,(為了防止最新版本有各種問題)創建一個名為 “MyApplication” 的項目。注意項目路徑不要太長,如圖所示:

? 連接真機,點擊?File > Project Structure,在彈窗界面點擊?Signing Configs,勾選?Support HarmonyOS?和?Automatically generate signature,然后點擊?Sign In?登錄華為賬號,并簽名。

添加 React Native 配置

在?entry?目錄下執行以下命令:

ohpm i @rnoh/react-native-openharmony@x.x.x

執行完成后會在工程級目錄以及模塊級目錄下生成?oh_modules?文件夾。

注意:

  1. 指令中@x.x.x用于指定下載的版本,不指定時默認下載最新版本。
  2. 由于 har 包比較大,這一步耗時會比較長,務必保證?ohpm install?和 IDE 自發的?SyncData?全都完成,否則會導致編譯報錯。
  3. 如何在三方庫或自定義module中引入rnoh的依賴,請參考文檔。

在原生工程中集成RNOH

補充CPP側代碼

  1. 在?MyApplication/entry/src/main?目錄下新建 cpp 文件夾。
  2. 在 cpp 目錄下新增?CMakeLists.txt,并將?RNOH?的適配層代碼添加到編譯構建中生成?librnoh_app.so
    project(rnapp)
    cmake_minimum_required(VERSION 3.4.1)
    set(CMAKE_SKIP_BUILD_RPATH TRUE)
    set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
    set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/src/main/cpp")
    set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated")
    set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
    set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
    add_compile_definitions(WITH_HITRACE_SYSTRACE)
    set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to useadd_subdirectory("${RNOH_CPP_DIR}" ./rn)add_library(rnoh_app SHARED"./PackageProvider.cpp""${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
    )target_link_libraries(rnoh_app PUBLIC rnoh)
    
  3. 在 cpp 目錄下新增?PackageProvider.cpp,該文件需要滿足以下要求:
    • 需要導入?RNOH/PackageProvider
    • 實現?getPackages?方法,用于創建三方庫或自定義 TurboModule 或 Fabric 的 package 對象。

    此處不涉及三方庫與自定義 TurboModule 或組件,需要返回空數組。

    #include "RNOH/PackageProvider.h"using namespace rnoh;std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {return {};
    }
    
  4. 打開?MyApplicaton\entry\build-profile.json5,將 cpp 中的代碼添加到鴻蒙的編譯構建任務中,詳細介紹可以參考模塊級build-profile.json5:
    {"apiType": "stageMode","buildOption": {
    +   "externalNativeOptions": {
    +      "path": "./src/main/cpp/CMakeLists.txt",
    +      "arguments": "",
    +      "cppFlags": "",
    +    }},"buildOptionSet": [{"name": "release","arkOptions": {"obfuscation": {"ruleOptions": {"enable": true,"files": ["./obfuscation-rules.txt"]}}}},],"targets": [{"name": "default"},{"name": "ohosTest",}]
    }
    

補充ArkTS側的代碼

  1. 打開?MyApplicaton\entry\src\main\ets\entryability\EntryAbility.ets,引入并使用?RNAbility,該文件需要滿足以下的要求:
    • 如果需要擴展使用對應的生命周期函數,請在代碼中使用 super,RNAbility?在生命周期函數中進行了對應的操作,需要使用 super 保證功能不丟失;
    • 需要重寫?getPagePath,返回程序的入口 page。
    import { RNAbility } from '@rnoh/react-native-openharmony';export default class EntryAbility extends RNAbility {getPagePath() {return 'pages/Index';}
    }
    
  2. 在?MyApplicaton\entry\src\main\ets?目錄下新增?RNPackagesFactory.ets,該文件需要滿足以下要求:
    • 在?@rnoh/react-native-openharmony?導入?RNPackageContext?和?RNPackage
    • 在文件中導出?createRNPackages?方法,用于創建三方庫或自定義 TurboModule、Fabric的package 對象。

    此處不涉及三方庫與自定義TurboModule或組件,需要返回空數組。

    import { RNPackageContext, RNPackage } from '@rnoh/react-native-openharmony/ts';
    export function createRNPackages(ctx: RNPackageContext): RNPackage[] {return [];
    }
    
  3. 打開?MyApplicaton\entry\src\main\ets\pages\Index.ets,添加RNOH的使用代碼,修改后如下:

    RNApp的參數appKey需要與RN工程中AppRegistry.registerComponent注冊的appName保持一致,否則會導致白屏。

    import {AnyJSBundleProvider,ComponentBuilderContext,FileJSBundleProvider,MetroJSBundleProvider,ResourceJSBundleProvider,RNApp,RNOHErrorDialog,RNOHLogger,TraceJSBundleProviderDecorator,RNOHCoreContext
    } from '@rnoh/react-native-openharmony';
    import { createRNPackages } from '../RNPackagesFactory';@Builder
    export function buildCustomRNComponent(ctx: ComponentBuilderContext) {}const wrappedCustomRNComponentBuilder = wrapBuilder(buildCustomRNComponent)@Entry
    @Component
    struct Index {@StorageLink('RNOHCoreContext') private rnohCoreContext: RNOHCoreContext | undefined = undefined@State shouldShow: boolean = falseprivate logger!: RNOHLoggeraboutToAppear() {this.logger = this.rnohCoreContext!.logger.clone("Index")const stopTracing = this.logger.clone("aboutToAppear").startTracing();this.shouldShow = truestopTracing();}onBackPress(): boolean | undefined {// NOTE: this is required since `Ability`'s `onBackPressed` function always// terminates or puts the app in the background, but we want Ark to ignore it completely// when handled by RNthis.rnohCoreContext!.dispatchBackPress()return true}build() {Column() {if (this.rnohCoreContext && this.shouldShow) {if (this.rnohCoreContext?.isDebugModeEnabled) {RNOHErrorDialog({ ctx: this.rnohCoreContext })}RNApp({rnInstanceConfig: {createRNPackages,enableNDKTextMeasuring: true, // 該項必須為true,用于開啟NDK文本測算enableBackgroundExecutor: false,enableCAPIArchitecture: true, // 該項必須為true,用于開啟CAPIarkTsComponentNames: []},initialProps: { "foo": "bar" } as Record<string, string>,appKey: "AwesomeProject",wrappedCustomRNComponentBuilder: wrappedCustomRNComponentBuilder,onSetUp: (rnInstance) => {rnInstance.enableFeatureFlag("ENABLE_RN_INSTANCE_CLEAN_UP")},jsBundleProvider: new TraceJSBundleProviderDecorator(new AnyJSBundleProvider([new MetroJSBundleProvider(),// NOTE: to load the bundle from file, place it in// `/data/app/el2/100/base/com.rnoh.tester/files/bundle.harmony.js`// on your device. The path mismatch is due to app sandboxing on OpenHarmonynew FileJSBundleProvider('/data/storage/el2/base/files/bundle.harmony.js'),new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'hermes_bundle.hbc'),new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js')]),this.rnohCoreContext.logger),})}}.height('100%').width('100%')}
    }
    

加載bundle包

? 在上一章節中已經完成了 bundle 文件的生成,接下來將它加載到 DevEco Studio 中以運行 MyApplication 項目。加載 bundle 有三種方式:

  • 方式一:本地加載 bundle。將 bundle 文件和 assets 圖片放在?entry/src/main/resources/rawfile?路徑下,在?entry/src/main/ets/pages/Index.ets?中使用。

官方文檔寫了3種方式。我用的第一種!

全量編譯 C++ 代碼耗時較長,請耐心等待。

報錯:

由于cpp 目錄錯誤導致。

"externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "","cppFlags": "","abiFilters": ["x86_64","arm64-v8a"]}

運行出錯:

Error message:Couldn't create bindings between ETS and CPP. libRNOHApp is undefined.
Stacktrace:
SourceMap is not initialized yet
at RNOHError (entry|@rnoh/react-native-openharmony|0.72.27|src/main/ets/RNOH/RNOHError.ts:16:9)
at FatalRNOHError (entry|@rnoh/react-native-openharmony|0.72.27|src/main/ets/RNOH/RNOHError.ts:1:1)
at onInit (entry|@rnoh/react-native-openharmony|0.72.27|src/main/ets/RNOH/NapiBridge.js:12:25)
at create (entry|@rnoh/react-native-openharmony|0.72.27|src/main/ets/RNOH/RNInstancesCoordinator.ts:63:36)
at onCreate (entry|@rnoh/react-native-openharmony|0.72.27|src/main/ets/RNOH/RNAbility.ts:64:39)

始終沒有解決 。

最后降低了?@rnoh/react-native-openharmony": 本版。

從?@rnoh/react-native-openharmony@0.72.67 到?@rnoh/react-native-openharmony": "0.72.38"

最終運行通過。

release包使用

  1. 在?MyApplication?目錄下新建 libs 文件夾,將?react_native_openharmony-xxx-release.har?放入該目錄。

  2. 打開?MyApplication/entry?下的?oh-package.json5,替換 har 包的依賴為對應版本的 release 包:

    {"name": "entry","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {
    +     "@rnoh/react-native-openharmony": "file:../libs/react_native_openharmony-xxx-release.har"}
    }
    
  3. 替換?MyApplication\entry\src\main\cpp\CMakeLists.txt?文件為以下代碼:

    project(rnapp)
    cmake_minimum_required(VERSION 3.4.1)
    set(CMAKE_SKIP_BUILD_RPATH TRUE)
    set(NATIVERENDER_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
    set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
    set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/src/main/include")
    set(REACT_COMMON_PATCH_DIR "${RNOH_CPP_DIR}/patches/react_native_core")set(CMAKE_CXX_STANDARD 17)
    set(LOG_VERBOSITY_LEVEL 1)
    set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
    set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated")
    set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie -DNDEBUG")
    set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
    add_compile_definitions(WITH_HITRACE_SYSTRACE)
    # folly的編譯選項
    set(folly_compile_options-DFOLLY_NO_CONFIG=1-DFOLLY_MOBILE=1-DFOLLY_USE_LIBCPP=1-DFOLLY_HAVE_RECVMMSG=1-DFOLLY_HAVE_PTHREAD=1-Wno-comma-Wno-shorten-64-to-32-Wno-documentation-faligned-new
    )
    add_compile_options("-Wno-unused-command-line-argument")
    # 添加頭文件目錄
    include_directories(${NATIVERENDER_ROOT_PATH}${RNOH_CPP_DIR}${REACT_COMMON_PATCH_DIR}${RNOH_CPP_DIR}/third-party/folly${RNOH_CPP_DIR}/third-party/rn/ReactCommon${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/nativemodule/core${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi${RNOH_CPP_DIR}/third-party/rn/ReactCommon/callinvoker${RNOH_CPP_DIR}/third-party/boost/libs/utility/include${RNOH_CPP_DIR}/third-party/boost/libs/stacktrace/include${RNOH_CPP_DIR}/third-party/boost/libs/predef/include${RNOH_CPP_DIR}/third-party/boost/libs/array/include${RNOH_CPP_DIR}/third-party/boost/libs/throw_exception/include${RNOH_CPP_DIR}/third-party/boost/libs/config/include${RNOH_CPP_DIR}/third-party/boost/libs/core/include${RNOH_CPP_DIR}/third-party/boost/libs/preprocessor/include${RNOH_CPP_DIR}/third-party/double-conversion${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/renderer/graphics/platform/cxx${RNOH_CPP_DIR}/third-party/rn/ReactCommon/runtimeexecutor${RNOH_CPP_DIR}/third-party/glog/src${RNOH_CPP_DIR}/third-party/boost/libs/mpl/include${RNOH_CPP_DIR}/third-party/boost/libs/type_traits/include${RNOH_CPP_DIR}/third-party/rn/ReactCommon/yoga${RNOH_CPP_DIR}/third-party/boost/libs/intrusive/include${RNOH_CPP_DIR}/third-party/boost/libs/assert/include${RNOH_CPP_DIR}/third-party/boost/libs/move/include${RNOH_CPP_DIR}/third-party/boost/libs/static_assert/include${RNOH_CPP_DIR}/third-party/boost/libs/container_hash/include${RNOH_CPP_DIR}/third-party/boost/libs/describe/include${RNOH_CPP_DIR}/third-party/boost/libs/mp11/include${RNOH_CPP_DIR}/third-party/boost/libs/iterator/include${RNOH_CPP_DIR}/third-party/boost/libs/detail/include${RNOH_CPP_DIR}/patches/react_native_core/react/renderer/textlayoutmanager/platform/harmony)configure_file(${RNOH_CPP_DIR}/third-party/folly/CMake/folly-config.h.cmake${RNOH_CPP_DIR}/third-party/folly/folly/folly-config.h
    )
    file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")
    # 添加rnoh動態共享包
    add_library(rnoh SHARED"${RNOH_CPP_DIR}/RNOHOther.cpp""${RNOH_CPP_DIR}/third-party/folly/folly/lang/SafeAssert.cpp")
    # 鏈接其他so
    target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@rnoh/react-native-openharmony/libs/arm64-v8a)
    target_link_libraries(rnoh PUBLICrnoh_semilibace_napi.z.solibace_ndk.z.solibrawfile.z.solibhilog_ndk.z.solibnative_vsync.solibnative_drawing.solibc++_shared.solibhitrace_ndk.z.soreact_render_schedulerrrc_imagerrc_textrrc_textinputrrc_scrollviewreact_nativemodule_corereact_render_animationsjsinspectorhermesjsiloggerreact_configreact_debugreact_render_attributedstringreact_render_componentregistryreact_render_corereact_render_debugreact_render_graphicsreact_render_imagemanagerreact_render_mapbufferreact_render_mountingreact_render_templateprocessorreact_render_textlayoutmanagerreact_render_telemetryreact_render_uimanagerreact_utilsrrc_rootrrc_viewreact_render_leakcheckerreact_render_runtimeschedulerruntimeexecutor)if("$ENV{RNOH_C_API_ARCH}" STREQUAL "1")message("Experimental C-API architecture enabled")target_link_libraries(rnoh PUBLIC libqos.so)target_compile_definitions(rnoh PUBLIC C_API_ARCH)
    endif()
    # RNOH_END: add_package_subdirectories# 添加rnoh_app共享包
    add_library(rnoh_app SHARED${GENERATED_CPP_FILES}"./PackageProvider.cpp""${RNOH_CPP_DIR}/RNOHOther.cpp""${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
    )target_link_libraries(rnoh_app PUBLIC rnoh)target_compile_options(rnoh_app PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED -std=c++17)
    
  4. 將?MyApplication/entry?的?oh_modules?文件夾刪除,點擊?entry?文件夾,再點擊頂部菜單欄的?build>Clean Project?清除項目緩存。

  5. 點擊頂部菜單欄的?File?>?Sync and Refresh Project?來執行?ohpm install,執行完成后會在?entry?目錄下生成?oh_modules?文件夾。

  6. 點擊頂部菜單欄的?Run>Run 'entry'?運行工程 。

運行結果:

  • 打包 release的時候 ,har中沒有 x86_64 。所以最終會運行失敗。 有真機的小伙伴可以測試下。

完!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80782.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態網站 LNMP

一、名詞解釋&#xff1a; LNMP&#xff1a; L : 代表 Linux 操作系統&#xff0c;為網站提供了可靠的運行環境N : 代表 Nginx&#xff0c;它是一款輕量級的高性能 Web 服務器&#xff0c;能夠快速處理大量并 發連接&#xff0c;有效提升網站的訪問速度和性能 M : 代表…

DAY04:Vue.js 指令與事件處理深度解析之從基礎到實戰

1. 指令系統核心概念 1.1 插值表達式與基礎指令 Vue.js 的指令系統是其響應式編程模型的核心&#xff0c;我們首先從最基礎的插值表達式開始&#xff1a; <div id"app"><!-- 基礎文本插值 --><p>{{ message }}</p><!-- JavaScript 表達…

12配置Hadoop集群-集群配置

&#xff08;一&#xff09;Hadoop的組成 對普通用戶來說&#xff0c; Hadoop就是一個東西&#xff0c;一個整體&#xff0c;它能給我們提供無限的磁盤用來保存文件&#xff0c;可以使用提供強大的計算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三個組成部…

Kubernetes生產實戰(四):kubelet日志快速定位指南

kubelet作為Kubernetes節點的核心管家&#xff0c;其日志是排查節點問題的金鑰匙。本文將分享生產環境中查看和分析kubelet日志的完整方案&#xff0c;助你快速定位節點級故障。 一、基礎操作&#xff1a;快速查看日志 1. systemd服務日志&#xff08;推薦首選&#xff09; …

麥科信獲評CIAS2025金翎獎【半導體制造與封測領域優質供應商】

在蘇州舉辦的2025CIAS動力能源與半導體創新發展大會上&#xff0c;深圳麥科信科技有限公司憑借在測試測量領域的技術積累&#xff0c;入選半導體制造與封測領域優質供應商榜單。本屆大會以"新能源芯時代"為主題&#xff0c;匯集了來自功率半導體、第三代材料應用等領…

Python實例題:pygame開發打飛機游戲

目錄 Python實例題 題目 pygame-aircraft-game使用 Pygame 開發的打飛機游戲腳本 代碼解釋 初始化部分&#xff1a; 游戲主循環&#xff1a; 退出部分&#xff1a; 運行思路 注意事項 Python實例題 題目 pygame開發打飛機游戲 pygame-aircraft-game使用 Pygame 開發…

Gin 框架入門

Gin 框架入門 一、響應數據 JSON 響應 在 Web 開發中&#xff0c;JSON 是一種常用的數據交換格式。Gin 提供了簡便的方法來響應 JSON 數據。 package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *…

Flink實時數倉數據突變時,如何快速排查原因

在大數據時代,數據的價值已經被無數企業和組織深刻認識到,而實時數倉作為數據處理和分析的重要基礎設施,正在逐漸成為推動業務增長和決策優化的核心引擎。想象一下,電商平臺在雙十一大促期間需要實時監控訂單量、用戶行為,甚至庫存變化,以便及時調整營銷策略和物流調度;…

視頻人像摳圖技術選型--截止2025年4月

前言&#xff1a;我是一名算法工程師&#xff0c;經常需要對某個AI功能做技術調研和輸出技術選型報告&#xff0c;在過去多年的工作當中&#xff0c;積累了很多內容&#xff0c;我會陸陸續續將這些內容整理出來分享給大家&#xff0c;希望大家喜歡&#xff0c;感謝您的閱讀&…

docker compose ps 命令

docker compose ps 命令用于列出與 Docker Compose 項目相關的容器及其狀態。 docker compose ps 能顯示當前項目中所有服務容器的運行狀態、端口映射等信息。 語法 docker compose ps [OPTIONS] [SERVICE…] SERVICE&#xff08;可選&#xff09;&#xff1a;指定要查看狀態…

C語言 字符函數和字符串函數(1)

目錄 1.字符分類函數 2.字符轉換函數 3.strlen的使用和模擬實現 4.strcpy的使用和模擬實現 在編程的過程中&#xff0c;我們經常要處理字符和字符串&#xff0c;為了方便操作字符和字符串&#xff0c;C語言標準庫中提 供了一系列庫函數&#xff0c;接下來我們就學習一下這…

MySQL 中如何進行 SQL 調優?

在MySQL中進行SQL調優是一個系統性工程&#xff0c;需結合索引優化、查詢改寫、性能分析工具、數據庫設計及硬件配置等多方面策略。以下是具體優化方法及案例說明&#xff1a; 一、索引優化&#xff1a;精準提速的關鍵 索引類型選擇 普通索引&#xff1a;加速頻繁查詢的列&…

OpenCV圖像金字塔詳解:原理、實現與應用

一、什么是圖像金字塔&#xff1f; 圖像金字塔是圖像處理中一種重要的多尺度表示方法&#xff0c;它通過對圖像進行重復的平滑和降采樣&#xff08;或上采樣&#xff09;操作&#xff0c;生成一系列分辨率逐漸降低&#xff08;或升高&#xff09;的圖像集合。這種結構形似金字…

收集飛花令碎片——C語言分支與循環語句(上)

前言 Hello,各位碼友&#xff0c;本章將會給大家帶來C語言的分支與循環整章串講&#xff0c;這一張的內容分為基礎知識和程序練習兩個部分 希望通過這一章能夠帶大家更好地去掌握C語言的分支與循環語句 大家一起努力吧 C語言分支與循環語句&#xff08;基礎知識&#xff09; C…

嵌入式硬件篇---TOF|PID

文章目錄 前言1. 硬件準備主控芯片ToF模塊1.VL53L0X2.TFmini 執行機構&#xff1a;電機舵機其他 2. 硬件連接(1) VL53L0X&#xff08;IC接口&#xff09;(2) TFmini&#xff08;串口通信&#xff09; 3. ToF模塊初始化與數據讀取(1) VL53L0X&#xff08;基于HAL庫&#xff09;(…

PCB設計實踐(十二)PCB設計電容選型:功能、材質、規則

在PCB設計中&#xff0c;電容作為基礎元件承擔著濾波、儲能、去耦、耦合等核心功能。其分類與使用規則直接影響電路穩定性、抗干擾能力和信號完整性。本文從工程實踐角度系統梳理PCB設計中電容的五大分類、選型規范及布局布線規則&#xff0c;幫助設計者構建科學的電容應用體系…

vue2關閉eslint

在項目根目錄下找到 vue.config.js 文件。如果沒有該文件&#xff0c;可以直接在項目根目錄創建一個。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一對多關聯映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis實現一對多關系時&#xff0c;可以通過XML映射文件來配置。下面我將詳細介紹幾種實現方式。 基本概念 一對多關系指的是一個實體對象包含多個子對象集合的情況&#xff0c;例如&#xff1a; 一個部門有多個員工一個訂單有多個訂單項一個博客有多個…

基于Stable Diffusion XL模型進行文本生成圖像的訓練

基于Stable Diffusion XL模型進行文本生成圖像的訓練 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地圖api教程001:初始化地圖

文章目錄 1、初始化地圖1.1 創建react項目1.2 可視化地圖1.3 設置衛星地圖1.4 添加開關開啟3D地圖1.5 代碼下載1、初始化地圖 1.1 創建react項目 創建geodeapi項目: npx create-react-app gaodeapi安裝高德地圖包: npm install @amap/amap-jsapi-loader1.2 可視化地圖 在…