React Native 錯誤解決方案
React Native 錯誤處理完全指南
深入解析跨平臺應(yīng)用中的 JS 錯誤、原生崩潰及異常監(jiān)控方案,附實戰(zhàn)代碼與最佳實踐。
在 React Native 跨平臺開發(fā)中,錯誤處理是保障應(yīng)用穩(wěn)定性與用戶體驗的核心環(huán)節(jié)。不同于純 Web 應(yīng)用或原生應(yīng)用,React Native 應(yīng)用的錯誤來源更為復(fù)雜——既包含 JavaScript 層的邏輯錯誤,也涉及 iOS/Android 雙端的原生模塊異常,甚至可能因 JS 與原生通信異常引發(fā)崩潰。本文將系統(tǒng)梳理 React Native 中的錯誤類型、核心處理工具、實戰(zhàn)場景解決方案及監(jiān)控策略,幫助開發(fā)者構(gòu)建更穩(wěn)健的跨平臺應(yīng)用。
一、React Native 錯誤類型解析
React Native 應(yīng)用的錯誤主要分為兩大類:JavaScript 層錯誤與原生層錯誤,二者在觸發(fā)場景、表現(xiàn)形式及處理方式上存在顯著差異。
(一)JavaScript 層錯誤
這類錯誤發(fā)生在 React Native 的 JS 運(yùn)行時(如 Hermes 或 JSC),多由代碼邏輯缺陷導(dǎo)致,常見場景包括:變量未定義、函數(shù)調(diào)用方式錯誤、數(shù)組越界、異步操作異常等。
關(guān)鍵特征
- 開發(fā)環(huán)境下:會觸發(fā) RedBox(紅色錯誤提示框),顯示錯誤信息、文件路徑及堆棧跟蹤,直接阻斷應(yīng)用運(yùn)行。
- 生產(chǎn)環(huán)境下:默認(rèn)不會顯示錯誤提示,若未處理會導(dǎo)致應(yīng)用白屏、功能失效,嚴(yán)重時引發(fā) JS 線程阻塞。
- 可通過 React 生態(tài)工具或 JS 原生 API 捕獲。
常見示例
// 1. 變量未定義錯誤
function greet() {
console.log(name); // name 未聲明,觸發(fā) ReferenceError
}
// 2. 異步操作錯誤(未捕獲的 Promise 拒絕)
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data.user.name; // 若 data.user 為 undefined,觸發(fā) TypeError
};
fetchData(); // 未添加 catch 處理,導(dǎo)致未捕獲 Promise 錯誤(二)原生層錯誤
這類錯誤發(fā)生在 iOS 或 Android 的原生代碼中,常見于自定義原生模塊、第三方原生庫兼容性問題、原生 API 調(diào)用不當(dāng)?shù)葓鼍?,例如:iOS 中數(shù)組越界、Android 中空指針異常、原生模塊向 JS 傳遞非法數(shù)據(jù)等。
關(guān)鍵特征
- 開發(fā)/生產(chǎn)環(huán)境下:通常直接導(dǎo)致應(yīng)用 崩潰,并在原生日志(Xcode 控制臺、Android Logcat)中輸出堆棧跟蹤。
- 難以通過 JS 層直接捕獲,需借助原生錯誤處理機(jī)制或跨層通信工具。
- 影響范圍更廣,可能破壞應(yīng)用進(jìn)程穩(wěn)定性,甚至導(dǎo)致用戶無法重啟應(yīng)用。
常見示例
- iOS 原生錯誤(Swift):
// 自定義原生模塊中數(shù)組越界
@objc func getRandomItem(_ callback: RCTResponseSenderBlock) {
let items = ["a", "b"]
let randomIndex = 3 // 超出數(shù)組長度(0-1)
let item = items[randomIndex] // 觸發(fā) IndexOutOfRangeException,導(dǎo)致應(yīng)用崩潰
callback([nil, item])
}
- Android 原生錯誤(Kotlin):
// 原生模塊中空指針異常
@ReactMethod
fun showToast(message: String) {
val toast = Toast.makeText(null, message, Toast.LENGTH_SHORT) // context 為 null,觸發(fā) NullPointerException
toast.show()
}

層級結(jié)構(gòu):應(yīng)用層 → JavaScript 層(RedBox/白屏)、原生層(iOS/Android 崩潰)→ 底層運(yùn)行時(Hermes/JSC、原生系統(tǒng) API)
二、核心錯誤處理工具與 API
針對不同類型的錯誤,React Native 提供了多層次的處理工具——從 React 內(nèi)置的錯誤邊界,到 JS 運(yùn)行時 API,再到原生層的崩潰捕獲機(jī)制。
(一)JavaScript 層核心處理工具
1. Error Boundaries(錯誤邊界)
Error Boundaries 是 React 16+ 引入的官方錯誤捕獲機(jī)制,專門用于捕獲子組件樹中的 JS 錯誤(包括渲染錯誤、生命周期方法錯誤),并展示降級 UI,避免整個組件樹崩潰。注意:它無法捕獲異步操作(如 setTimeout、Promise)、事件處理器中的錯誤及服務(wù)器端渲染錯誤。
實現(xiàn)方式
需創(chuàng)建一個類組件,實現(xiàn) getDerivedStateFromError(更新錯誤狀態(tài))和 componentDidCatch(日志上報)兩個生命周期方法:
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null };
}
// 靜態(tài)方法:捕獲錯誤并更新組件狀態(tài),用于渲染降級 UI
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
// 實例方法:捕獲錯誤信息,可用于日志上報
componentDidCatch(error, errorInfo) {
// 上報錯誤到監(jiān)控平臺(如 Sentry)
console.error('Error Boundary 捕獲錯誤:', error, errorInfo.componentStack);
}
render() {
if (this.state.hasError) {
// 降級 UI:向用戶展示友好提示
return (
<div style={{ padding: 20, textAlign: 'center' }}>
<h2>頁面加載出錯了</h2>
<p>{this.state.error?.message}</p>
<button onClick={() => this.setState({ hasError: false })}>
刷新頁面
</button>
</div>
);
}
// 無錯誤時,渲染子組件樹
return this.props.children;
}
}
// 使用方式:包裹可能出錯的組件
export default function App() {
return (
<ErrorBoundary>
<MainComponent /> {/* 可能觸發(fā) JS 錯誤的核心組件 */}
</ErrorBoundary>
);
}2. React Native Error Utils
ErrorUtils 是 React Native 內(nèi)置的 JS 錯誤捕獲工具,可全局監(jiān)聽未被錯誤邊界捕獲的 JS 錯誤(包括異步操作錯誤),相當(dāng)于 JS 層的“最后一道防線”。
使用方式
import { ErrorUtils } from 'react-native';
// 保存原始錯誤處理函數(shù)(可選,便于后續(xù)恢復(fù)默認(rèn)行為)
const originalErrorHandler = ErrorUtils.getGlobalHandler();
// 自定義全局錯誤處理函數(shù)
const customErrorHandler = (error, isFatal) => {
// isFatal:布爾值,標(biāo)識錯誤是否致命(可能導(dǎo)致應(yīng)用崩潰)
console.error(`全局捕獲 JS 錯誤(${isFatal ? '致命' : '非致命'}):`, error);
// 上報錯誤信息(如錯誤消息、堆棧跟蹤、設(shè)備信息)
reportErrorToMonitor({
message: error.message,
stack: error.stack,
isFatal,
platform: Platform.OS,
});
// 若需要保留默認(rèn)行為(如開發(fā)環(huán)境顯示 RedBox),可調(diào)用原始處理函數(shù)
originalErrorHandler(error, isFatal);
};
// 注冊全局錯誤處理函數(shù)
ErrorUtils.setGlobalHandler(customErrorHandler);3. Promise 錯誤捕獲
React Native 中未捕獲的 Promise 拒絕(如未添加 catch 的異步請求)會觸發(fā)警告(開發(fā)環(huán)境)或靜默失敗(生產(chǎn)環(huán)境),需通過以下方式統(tǒng)一處理:
// 監(jiān)聽未捕獲的 Promise 拒絕
if (YellowBox) {
// 開發(fā)環(huán)境:屏蔽特定警告(可選)
YellowBox.ignoreWarnings(['Possible Unhandled Promise Rejection']);
}
// 全局捕獲未處理的 Promise 錯誤
process.on('unhandledRejection', (reason, promise) => {
console.error('未處理的 Promise 錯誤:', reason, promise);
// 上報錯誤信息
reportErrorToMonitor({
type: 'UnhandledPromiseRejection',
message: reason?.message || String(reason),
stack: reason?.stack,
});
});(二)原生層錯誤處理工具
原生層錯誤(崩潰)無法通過 JS 工具直接捕獲,需分別在 iOS 和 Android 端實現(xiàn)原生錯誤處理邏輯,或使用第三方監(jiān)控庫簡化流程。
1. iOS 原生錯誤捕獲(Swift/Objective-C)
iOS 中可通過 NSSetUncaughtExceptionHandler 捕獲未處理的異常,通過 signal 監(jiān)聽信號量錯誤(如內(nèi)存訪問錯誤):
// AppDelegate.swift
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 注冊異常捕獲處理器
NSSetUncaughtExceptionHandler { exception in
let name = exception.name.rawValue
let reason = exception.reason ?? "未知原因"
let stackTrace = exception.callStackSymbols.joined(separator: "\n")
// 保存錯誤日志到本地或上報
let errorLog = "iOS 崩潰:\n名稱:\(name)\n原因:\(reason)\n堆棧:\(stackTrace)"
print(errorLog)
// 調(diào)用自定義上報方法
ErrorReporter.shared.report(errorLog: errorLog)
}
// 監(jiān)聽信號量錯誤(如 SIGSEGV、SIGABRT)
let signals = [SIGABRT, SIGILL, SIGSEGV, SIGFPE, SIGBUS, SIGPIPE]
for signal in signals {
signal(signal) { sig in
let errorLog = "iOS 信號量錯誤:信號 \(sig)"
print(errorLog)
ErrorReporter.shared.report(errorLog: errorLog)
// 退出應(yīng)用(避免僵尸進(jìn)程)
exit(sig)
}
}
return true
}
}2. Android 原生錯誤捕獲(Kotlin/Java)
Android 中可通過實現(xiàn) Thread.UncaughtExceptionHandler 捕獲線程未處理的異常:
// CrashHandler.kt
import android.content.Context
import java.io.PrintWriter
import java.io.StringWriter
class CrashHandler(private val context: Context) : Thread.UncaughtExceptionHandler {
// 保存默認(rèn)異常處理器
private val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
override fun uncaughtException(t: Thread, e: Throwable) {
// 收集錯誤信息
val errorLog = StringBuilder()
errorLog.append("Android 崩潰:\n線程:${t.name}\n")
// 獲取堆棧跟蹤
val sw = StringWriter()
val pw = PrintWriter(sw)
e.printStackTrace(pw)
errorLog.append("堆棧:${sw.toString()}")
// 保存日志或上報
print(errorLog.toString())
ErrorReporter.report(context, errorLog.toString())
// 調(diào)用默認(rèn)處理器(觸發(fā)系統(tǒng)崩潰提示)
defaultHandler?.uncaughtException(t, e)
}
companion object {
// 在 Application 中初始化
fun init(context: Context) {
Thread.setDefaultUncaughtExceptionHandler(CrashHandler(context))
}
}
}
// 初始化(在自定義 Application 類中)
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
CrashHandler.init(this)
}
}三、實戰(zhàn)場景:關(guān)鍵業(yè)務(wù)錯誤處理方案
結(jié)合 React Native 開發(fā)中的高頻場景,以下是針對性的錯誤處理實踐方案,涵蓋網(wǎng)絡(luò)請求、異步操作、原生模塊調(diào)用等核心環(huán)節(jié)。
(一)網(wǎng)絡(luò)請求錯誤處理
網(wǎng)絡(luò)請求是錯誤高發(fā)場景,需處理請求失敗、響應(yīng)異常、數(shù)據(jù)解析錯誤等問題,建議封裝統(tǒng)一的請求工具:
import axios from 'axios';
import { Alert } from 'react-native';
// 創(chuàng)建 axios 實例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
});
// 請求攔截器:添加請求頭(如 Token)
api.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// 響應(yīng)攔截器:統(tǒng)一處理錯誤
api.interceptors.response.use(
(response) => response.data, // 成功時直接返回數(shù)據(jù)
(error) => {
let errorMessage = '網(wǎng)絡(luò)請求失敗,請稍后重試';
// 分類處理錯誤
if (error.response) {
// 服務(wù)器返回錯誤(4xx/5xx)
const status = error.response.status;
const data = error.response.data;
errorMessage = data?.message || `請求錯誤(${status})`;
// 特殊狀態(tài)碼處理(如 401 未授權(quán))
if (status === 401) {
// 觸發(fā)登出邏輯
logout();
errorMessage = '登錄已過期,請重新登錄';
}
} else if (error.request) {
// 無響應(yīng)(網(wǎng)絡(luò)錯誤、超時)
errorMessage = error.code === 'ECONNABORTED' ? '請求超時' : '網(wǎng)絡(luò)異常,請檢查網(wǎng)絡(luò)連接';
} else {
// 請求配置錯誤(如參數(shù)錯誤)
errorMessage = `請求配置錯誤:${error.message}`;
}
// 上報錯誤信息
reportErrorToMonitor({
type: 'NetworkError',
message: errorMessage,
stack: error.stack,
requestConfig: error.config,
});
// 向用戶展示錯誤提示
Alert.alert('提示', errorMessage);
return Promise.reject(error);
}
);
// 使用示例:獲取用戶數(shù)據(jù)
const fetchUser = async (userId) => {
try {
const data = await api.get(`/users/${userId}`);
return data;
} catch (error) {
// 業(yè)務(wù)層可額外處理(如重試、降級)
console.error('獲取用戶數(shù)據(jù)失?。?, error);
throw error; // 向上傳遞錯誤,供組件處理
}
};(二)原生模塊調(diào)用錯誤處理
React Native 調(diào)用自定義原生模塊時,需處理參數(shù)校驗、原生邏輯異常等問題,建議通過 Promise 封裝原生方法,便于捕獲錯誤:
1. 原生模塊封裝(以 Android 為例)
// CustomModule.kt
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.Promise
class CustomModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
override fun getName() = "CustomModule"
// 用 Promise 封裝原生方法,便于 JS 捕獲錯誤
@ReactMethod
fun processData(input: String, promise: Promise) {
try {
// 校驗參數(shù)
if (input.isEmpty()) {
throw IllegalArgumentException("輸入?yún)?shù)不能為空")
}
// 業(yè)務(wù)邏輯
val result = "處理后的結(jié)果:$input"
promise.resolve(result) // 成功回調(diào)
} catch (e: Exception) {
// 錯誤回調(diào):傳遞錯誤信息到 JS 層
promise.reject("PROCESS_ERROR", e.message, e)
}
}
}2. JS 層調(diào)用與錯誤處理
import { NativeModules } from 'react-native';
const { CustomModule } = NativeModules;
// 調(diào)用原生模塊方法
const processNativeData = async (input) => {
try {
const result = await CustomModule.processData(input);
return result;
} catch (error) {
// 捕獲原生模塊拋出的錯誤
console.error('原生模塊調(diào)用失敗:', error.code, error.message);
// 上報錯誤
reportErrorToMonitor({
type: 'NativeModuleError',
module: 'CustomModule',
method: 'processData',
code: error.code,
message: error.message,
});
// 向用戶提示
Alert.alert('錯誤', `處理失?。?{error.message}`);
throw error;
}
};
// 使用示例
processNativeData('測試輸入')
.then((result) => console.log(result))
.catch((error) => console.error(error));(三)異步操作錯誤處理(如文件讀寫、存儲)
React Native 中的異步操作(如 AsyncStorage、文件系統(tǒng)操作)需通過 try/catch 捕獲錯誤,并提供降級方案:
import AsyncStorage from '@react-native-async-storage/async-storage';
import { Alert } from 'react-native';
// 封裝 AsyncStorage 操作,統(tǒng)一處理錯誤
const StorageService = {
async setItem(key, value) {
try {
const jsonValue = JSON.stringify(value);
await AsyncStorage.setItem(key, jsonValue);
} catch (error) {
console.error(`存儲 ${key} 失?。篳, error);
// 上報錯誤
reportErrorToMonitor({
type: 'StorageError',
operation: 'setItem',
key,
message: error.message,
});
// 提示用戶
Alert.alert('存儲錯誤', '數(shù)據(jù)保存失敗,請檢查存儲空間');
throw error;
}
},
async getItem(key) {
try {
const jsonValue = await AsyncStorage.getItem(key);
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (error) {
console.error(`獲取 ${key} 失?。篳, error);
reportErrorToMonitor({
type: 'StorageError',
operation: 'getItem',
key,
message: error.message,
});
// 降級處理:返回默認(rèn)值
return null;
}
},
};[圖例插入標(biāo)識:React Native 異步操作錯誤處理流程示意圖] 流程節(jié)點:發(fā)起異步操作(setItem/getItem)→ try 塊執(zhí)行操作 → 成功:返回結(jié)果 / 失?。篶atch 捕獲 → 錯誤上報 → 用戶提示/降級處理
四、錯誤監(jiān)控與日志上報
僅在應(yīng)用內(nèi)處理錯誤不夠,還需建立完善的監(jiān)控體系,實時收集錯誤信息,以便定位問題并優(yōu)化。常用方案分為“自建監(jiān)控”和“第三方監(jiān)控”兩類。
(一)第三方監(jiān)控工具(推薦)
第三方工具已封裝好 JS 層與原生層的錯誤捕獲邏輯,支持崩潰分析、用戶行為追蹤、設(shè)備信息收集等功能,主流工具包括:
1. Sentry
- 支持 React Native 全平臺錯誤捕獲(JS 錯誤、原生崩潰)。
- 提供詳細(xì)的堆棧跟蹤、錯誤上下文(用戶信息、設(shè)備信息、應(yīng)用版本)。
- 支持錯誤分組、告警通知(郵件、Slack)。
集成示例
// 安裝依賴:npm install @sentry/react-native && npx pod-install ios
import * as Sentry from '@sentry/react-native';
// 初始化 Sentry(在 App 入口處)
Sentry.init({
dsn: '你的 Sentry DSN',
environment: __DEV__ ? 'development' : 'production',
tracesSampleRate: 1.0, // 性能監(jiān)控采樣率
});
// 手動上報錯誤(可選)
try {
// 可能出錯的邏輯
} catch (error) {
Sentry.captureException(error, {
extra: { customInfo: '額外上下文信息' },
tags: { module: 'user', action: 'login' },
});
}2. Bugsnag
- 專注于移動應(yīng)用崩潰監(jiān)控,支持 React Native 雙端原生崩潰捕獲。
- 提供錯誤優(yōu)先級分級、用戶會話跟蹤、版本趨勢分析。
3. Firebase Crashlytics
- 與 Firebase 生態(tài)集成,適合使用 Firebase 的項目。
- 免費(fèi)版功能足夠滿足中小項目需求,支持崩潰統(tǒng)計與過濾。
(二)自建監(jiān)控系統(tǒng)
若需定制化監(jiān)控邏輯,可通過以下方式實現(xiàn):
- 日志收集:在 JS 層和原生層捕獲錯誤后,將錯誤日志(含錯誤信息、堆棧、設(shè)備信息、用戶 ID)保存到本地。
- 日志上報:在應(yīng)用下次啟動時,檢查本地日志,將未上報的錯誤通過網(wǎng)絡(luò)請求發(fā)送到自建服務(wù)器。
- 后臺管理:搭建后臺系統(tǒng),對錯誤日志進(jìn)行分類、統(tǒng)計、搜索,設(shè)置告警規(guī)則(如某類錯誤發(fā)生率超過 5% 時觸發(fā)告警)。
五、錯誤處理最佳實踐
(一)開發(fā)階段最佳實踐
- 啟用嚴(yán)格模式:在
App.js中啟用 React 嚴(yán)格模式,提前發(fā)現(xiàn)潛在問題:
import { StrictMode } from 'react';
import { AppRegistry } from 'react-native';
import App from './App';
import { name as appName } from './app.json';
AppRegistry.registerComponent(appName, () => () => <StrictMode><App /></StrictMode>);- 禁用生產(chǎn)環(huán)境的 RedBox/YellowBox:避免向用戶暴露錯誤細(xì)節(jié),保護(hù)敏感信息。
- 編寫錯誤處理測試:使用 Jest 測試錯誤邊界、異常捕獲邏輯,確保其能正常工作。
(二)生產(chǎn)階段最佳實踐
- 避免靜默失敗:所有異步操作、原生模塊調(diào)用必須添加錯誤處理,禁止忽略
catch塊。 - 提供友好的用戶提示:避免向用戶展示技術(shù)術(shù)語(如“NullPointerException”),用通俗語言說明問題(如“數(shù)據(jù)加載失敗,請檢查網(wǎng)絡(luò)”)。
- 實現(xiàn)錯誤降級:核心功能出錯時,提供替代方案(如網(wǎng)絡(luò)請求失敗時展示緩存數(shù)據(jù))。
- 定期分析錯誤日志:優(yōu)先修復(fù)高頻錯誤、嚴(yán)重崩潰(如啟動時崩潰),持續(xù)優(yōu)化應(yīng)用穩(wěn)定性。
- 版本控制錯誤處理邏輯:記錄錯誤處理代碼的變更,便于回溯問題。
(三)跨平臺兼容性注意事項
- 原生模塊錯誤適配:針對 iOS 和 Android 原生模塊的差異,分別處理平臺專屬錯誤(如 iOS 的權(quán)限錯誤、Android 的存儲權(quán)限錯誤)。
- Hermes 引擎兼容:使用 Hermes 引擎時,部分 JS 錯誤的堆棧跟蹤格式會變化,需確保監(jiān)控工具支持 Hermes 日志解析。
- 第三方庫版本控制:避免因第三方原生庫版本更新導(dǎo)致的兼容性崩潰,建議鎖定關(guān)鍵依賴版本。
六、結(jié)語
React Native 錯誤處理的核心在于“分層捕獲、全面監(jiān)控、友好降級”——JS 層通過錯誤邊界和全局處理器覆蓋邏輯錯誤,原生層通過平臺專屬機(jī)制捕獲崩潰,再結(jié)合監(jiān)控工具實現(xiàn)問題的實時感知與快速定位。
開發(fā)者需根據(jù)應(yīng)用場景選擇合適的處理方案:小型應(yīng)用可使用 React 內(nèi)置工具+簡易日志上報;中大型應(yīng)用建議集成 Sentry 等第三方監(jiān)控工具,同時定制化錯誤處理邏輯。通過系統(tǒng)化的錯誤處理策略,能顯著提升應(yīng)用穩(wěn)定性,改善用戶體驗,降低運(yùn)維成本。
到此這篇關(guān)于React Native 錯誤處理完全指南的文章就介紹到這了,更多相關(guān)React Native 錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React中實現(xiàn)組件通信的幾種方式小結(jié)
在構(gòu)建復(fù)雜的React應(yīng)用時,組件之間的通信是至關(guān)重要的,從簡單的父子組件通信到跨組件狀態(tài)同步,不同組件之間的通信方式多種多樣,下面我們認(rèn)識react組件通信的幾種方式,需要的朋友可以參考下2024-04-04
React Native 真機(jī)斷點調(diào)試+跨域資源加載出錯問題的解決方法
下面小編就為大家分享一篇React Native 真機(jī)斷點調(diào)試+跨域資源加載出錯問題的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南
這篇文章主要介紹了JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南,React Web的目的即是把本地的React Native應(yīng)用程序項目變?yōu)閃eb應(yīng)用程序,需要的朋友可以參考下2016-05-05
React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制
這篇文章主要為大家介紹了React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

