React 和 Vue 項目中集成基于 Svelte 的 `Bytemd` 庫 || @bytemd/react` 底層實現原理

Bytemd 并使用Svelte 框架編寫的。Svelte 是一種不同的前端框架,它的核心思想是在編譯時將組件代碼轉換成高效、原生 JavaScript,從而避免運行時虛擬 DOM 的開銷

理解了這一點,我們就可以深入探討如何在 React 和 Vue 項目中適配 Svelte 編寫的 Bytemd 組件。


關于如何在 React 和 Vue 項目中集成基于 Svelte 的 Bytemd

關于如何在 React 和 Vue 項目中集成基于 Svelte 的 Bytemd 庫,這確實是一個跨框架集成(interoperability)的典型問題。核心挑戰在于 React/Vue 基于**虛擬 DOM** 的工作機制與 Svelte 編譯時直接操作真實 DOM 這兩種截然不同的組件模型。

直接在 React 的 JSX 或 Vue 的模板中使用 Svelte 組件是不可能的。解決方案是采用適配器(Wrapper)模式

具體來說,我將創建一個宿主框架(React 或 Vue)的組件,它不直接渲染 Svelte 組件的 JSX/模板,而是提供一個普通的 HTML 元素作為 Svelte 組件的掛載目標。宿主組件會利用自身的生命周期鉤子來手動實例化、更新和銷毀 Svelte 組件實例

這種模式的優點是實現了跨框架組件的重用,允許我們利用 Bytemd 這樣一個功能強大且性能優異的 Markdown 渲染庫,而無需將其完全重寫為 React 或 Vue 版本。主要挑戰在于理解和管理兩個框架的生命周期同步,以及處理各自構建系統對第三方庫的兼容性要求。"


一、核心問題:跨框架組件模型的差異

要理解為什么需要適配器,首先要明白 React、Vue 和 Svelte 在組件渲染和管理上的根本區別:

  • React (和 Vue): 這兩個框架都使用 虛擬 DOM (Virtual DOM)。當組件的狀態或 props 改變時,它們會重新計算組件的虛擬 DOM 樹,然后與上一次的虛擬 DOM 進行比較(diffing),找出需要更新的最小差異,最后只對真實 DOM 進行必要的修改。你編寫的 JSX 或 Vue 模板最終都會被編譯成 React.createElement 調用或等價的渲染函數,返回一個虛擬 DOM 節點樹。
  • Svelte: Svelte 的獨特之處在于它是一個編譯器。你編寫的 Svelte 組件在構建時就被編譯成了輕量級的、高性能的原生 JavaScript 代碼,這些代碼可以直接操作 DOM,而無需在運行時維護一個虛擬 DOM。這意味著 Svelte 組件的實例是一個普通的 JavaScript 類,它需要一個 DOM 元素作為 target 來掛載自身。

結論:
由于 React/Vue 組件返回的是虛擬 DOM 結構,而 Svelte 組件是一個需要 target 元素的類,它們之間無法直接兼容。你不能把一個 Svelte 組件的類直接放到 React 的 JSX 或 Vue 的模板中去渲染,因為這些框架不知道如何處理一個 Svelte 組件類。因此,我們需要一個“中間層”或“適配器”來橋接這兩個世界。


二、適配器(Wrapper)模式詳解

適配器模式的核心思想是:創建一個宿主框架(React 或 Vue)的組件,這個組件的職責就是管理 Svelte 組件的生命周期:實例化、更新數據和銷毀。

2.1 React 版本 Bytemd 適配

邏輯思路:

  1. 提供一個掛載點: 在 React 組件的渲染結果中,放置一個普通的 HTML div 元素。這個 div 將作為 Svelte Bytemd Viewertarget
  2. 獲取 DOM 引用: 使用 React 的 useRef 鉤子獲取到這個 div 的真實 DOM 引用。
  3. 生命周期管理: 使用 React 的 useEffect 鉤子來處理 Svelte 組件的生命周期事件:
    • 掛載時 (mount): 當 React 組件首次渲染,并且掛載點 div 準備就緒時,實例化 Svelte Bytemd Viewer (new SvelteBytemdViewer(...)),并將其掛載到 div 上。同時保存 Svelte 實例的引用。
    • 更新時 (update): 當 React 組件的 props(特別是 value,即 Markdown 內容)發生變化時,通過 Svelte 實例提供的 $set() 方法來更新 Svelte 組件內部的數據。Svelte 會自動根據新的數據重新渲染其內部的 DOM。
    • 卸載時 (unmount): 當 React 組件從 DOM 中移除時,調用 Svelte 實例提供的 $destroy() 方法,清理 Svelte 自身創建的 DOM 元素和事件監聽器,防止內存泄漏。
  4. 樣式導入: Bytemdhighlight.js 的 CSS 樣式需要全局引入,才能讓渲染出的 Markdown 和代碼塊擁有正確的樣式。

代碼實現 (src/app/components/Editor/ByteMarkdownViewer.tsx):

// src/app/components/Editor/ByteMarkdownViewer.tsx
'use client'; // Next.js App Router 中,使用 hooks 必須是客戶端組件import React, { useRef, useEffect } from 'react';// !!! 關鍵:導入 Svelte Bytemd Viewer 的編譯后 JS 文件 !!!
// 這個路徑是 bytemd 庫內部編譯后的 Svelte 組件 JS 入口。
// 通常是 'bytemd/lib/viewer',而不是 'bytemd' 或 '.svelte' 文件本身。
import SvelteBytemdViewer from 'bytemd/lib/viewer';// 導入 Bytemd 插件
import gfm from '@bytemd/plugin-gfm'; // GitHub Flavored Markdown
import highlight from '@bytemd/plugin-highlight'; // 代碼高亮
import breaks from '@bytemd/plugin-breaks'; // 處理換行// 重要的樣式導入:確保在您的項目全局 CSS 中導入,例如 src/app/globals.css
// import 'bytemd/dist/index.css'; // Bytemd 基礎樣式
// import 'highlight.js/styles/github.css'; // highlight.js 代碼高亮主題樣式 (選擇您喜歡的)// 定義 Bytemd Viewer 使用的插件
const plugins = [gfm(),highlight(),breaks(),
];interface ByteMarkdownViewerProps {/*** 要渲染的 Markdown 字符串。*/value: string;/*** 可選的 CSS 類名,應用于最外層 div。*/className?: string;
}/*** ByteMarkdownViewer 組件用于在 React 中渲染 Markdown 內容,* 它是 Svelte Bytemd Viewer 的一個 React 適配器。* 支持代碼高亮和標準的 Markdown 格式。** @param {ByteMarkdownViewerProps} props - 組件屬性* @returns {JSX.Element} 渲染后的 Markdown 內容的容器*/
const ByteMarkdownViewer: React.FC<ByteMarkdownViewerProps> = ({ value, className }) => {// 用于 Svelte Viewer 掛載的 DOM 元素引用const containerRef = useRef<HTMLDivElement>(null);// 用于存儲 Svelte Viewer 實例的引用const svelteViewerInstance = useRef<any>(null);useEffect(() => {// 1. 組件掛載時或容器就緒且實例未創建時:創建 Svelte Viewer 實例if (containerRef.current && !svelteViewerInstance.current) {svelteViewerInstance.current = new SvelteBytemdViewer({target: containerRef.current, // 指定 Svelte 掛載的 DOM 元素props: {value: value,    // 初始 Markdown 值plugins: plugins, // 初始插件配置},});}// 2. 組件更新時 (當 value 變化時):更新 Svelte Viewer 實例的 propselse if (svelteViewerInstance.current) {svelteViewerInstance.current.$set({value: value,// 如果 plugins 也會動態改變,這里也需要傳遞 plugins: plugins,// 但通常 plugins 是固定的,不頻繁更新});}// 3. 組件卸載時:銷毀 Svelte Viewer 實例,防止內存泄漏return () => {if (svelteViewerInstance.current) {svelteViewerInstance.current.$destroy(); // 調用 Svelte 實例的銷毀方法svelteViewerInstance.current = null;}};}, [value]); // 依賴 value,確保當 value 改變時,useEffect 重新運行并更新 Svelte 實例return (<div ref={containerRef} className={className}>{/* Svelte Bytemd Viewer 將會把其內容渲染到這個 div 內部 */}</div>);
};export default ByteMarkdownViewer;

React 適配的額外配置 (Next.js 場景):

由于 bytemd 及其插件是用 Svelte 編寫的,它們可能使用了最新的 ES Module 特性或 Svelte 特有的編譯產物,這可能導致在 Next.js 的構建或運行時出現兼容性問題(比如您遇到的 TypeError)。為了解決這個問題,需要告知 Next.js 顯式地轉譯這些包。

在您的 next.config.js 文件中添加 transpilePackages 配置:

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {// ... 其他配置 ...// 關鍵:告訴 Next.js 轉譯這些 Svelte 相關的包transpilePackages: ['bytemd', '@bytemd/plugin-gfm', '@bytemd/plugin-highlight', '@bytemd/plugin-breaks'],
};module.exports = nextConfig;

配置后務必重啟開發服務器 (npm run devyarn dev)。

2.2 Vue 版本 Bytemd 適配 (以 Vue 3 Composition API 為例)

邏輯思路:

與 React 類似,Vue 也需要一個包裝組件來管理 Svelte 實例。Vue 3 的 Composition API 提供了與 React Hooks 類似的生命周期鉤子和響應式引用。

  1. 提供一個掛載點: 在 Vue 組件的 <template> 中,使用 ref 屬性為一個 div 元素創建模板引用。
  2. 獲取 DOM 引用:<script setup> 中聲明一個 ref 變量,其名稱與模板引用匹配。
  3. 生命周期管理: 使用 Vue 3 的生命周期鉤子:
    • 掛載時 (onMounted): 在組件掛載到 DOM 后,檢查 div 引用是否可用,然后實例化 Svelte Bytemd Viewer
    • 更新時 (watch): 使用 watch 函數監聽 props.value 的變化,當變化發生時,調用 Svelte 實例的 $set() 方法更新數據。
    • 卸載時 (onUnmounted): 在組件即將被卸載時,調用 Svelte 實例的 $destroy() 方法進行清理。
  4. 樣式導入: 同樣需要全局引入 Bytemdhighlight.js 的 CSS 樣式。

代碼實現 (src/components/ByteMarkdownViewer.vue):

<template><div ref="containerRef" :class="className"></div>
</template><script setup lang="ts">
import { ref, onMounted, onUnmounted, watch } from 'vue';// !!! 關鍵:導入 Svelte Bytemd Viewer 的編譯后 JS 文件 !!!
// 同樣需要找到 bytemd 庫內部編譯后的 Svelte 組件 JS 入口。
import SvelteBytemdViewer from 'bytemd/lib/viewer';// 導入 Bytemd 插件
import gfm from '@bytemd/plugin-gfm';
import highlight from '@bytemd/plugin-highlight';
import breaks from '@bytemd/plugin-breaks';// 重要的樣式導入:確保在您的項目全局 CSS 中導入,例如 src/main.ts 或 App.vue
// import 'bytemd/dist/index.css';
// import 'highlight.js/styles/github.css';// 定義 Bytemd Viewer 使用的插件
const plugins = [gfm(),highlight(),breaks(),
];interface Props {value: string;className?: string;
}
const props = defineProps<Props>(); // 接收 propsconst containerRef = ref<HTMLDivElement | null>(null); // 模板引用
let svelteViewerInstance: any = null; // 用于存儲 Svelte 實例// 組件掛載后執行
onMounted(() => {if (containerRef.value) {svelteViewerInstance = new SvelteBytemdViewer({target: containerRef.value,props: {value: props.value,plugins: plugins,},});}
});// 監聽 props.value 的變化并同步到 Svelte 實例
watch(() => props.value,(newValue) => {if (svelteViewerInstance) {svelteViewerInstance.$set({ value: newValue });}}
);// 組件卸載前執行
onUnmounted(() => {if (svelteViewerInstance) {svelteViewerInstance.$destroy();svelteViewerInstance = null;}
});
</script><style scoped>
/* 這個 scoped 樣式只作用于當前 Vue 包裝組件的最外層 div */
.my-viewer-wrapper {/* 例如: background-color: #f0f0f0; */
}
</style><style>
/* 非 scoped 樣式塊,用于覆蓋 bytemd 生成的全局 DOM 元素的樣式 */
/* 這部分樣式應該與您在 React 的 .aiMarkdownContent :global(...) 中定義的類似 */
.bytemd-viewer {padding: 0 !important;margin: 0 !important;font-size: 14px;color: #333;line-height: 1.5;word-break: break-word;
}
.bytemd-viewer pre {background-color: #f5f5f5 !important;border-radius: 4px !important;padding: 8px 12px !important;margin-top: 8px !important;margin-bottom: 8px !important;overflow-x: auto !important;font-size: 13px !important;line-height: 1.4 !important;color: #333 !important;
}
.bytemd-viewer code {background-color: transparent !important;color: #c7254e !important;padding: 2px 4px !important;border-radius: 2px !important;
}
.bytemd-viewer pre code {background-color: transparent !important;color: inherit !important;padding: 0 !important;border-radius: 0 !important;
}
/* ... 更多根據 bytemd 渲染結果調整的 CSS 規則 ... */
</style>

三、Mermaid 示意圖

以下 Mermaid 圖展示了 React/Vue 應用如何通過一個包裝組件來集成 Svelte Bytemd Viewer

在這里插入圖片描述

圖例說明:

  • Svelte Bytemd Viewer Logic (藍色框): 展示了 Svelte 組件的內部工作原理:一個 Svelte 類被實例化,創建一個實例,該實例直接操作目標 HTML 元素來更新 UI。
  • React/Vue Application (淺綠/淺藍框): 分別代表了宿主框架的應用部分。
  • React/Vue Wrapper Component (深色邊框): 這是我們創建的適配器組件,它負責在宿主框架的生命周期內,與 Svelte Bytemd Viewer Class 交互,管理 Svelte Viewer Instance 的創建、更新和銷毀。
  • useRef/ref (實線箭頭指向 Target HTML Element): 表示 React/Vue 包裝組件獲取到 Svelte 渲染目標 DOM 元素的引用。
  • Hooks/Lifecycle Hooks (虛線箭頭指向 SvelteBytemdViewerClass): 表示包裝組件利用自身的生命周期機制來調用 Svelte 實例的方法。
  • Svelte Viewer Instance (實線箭頭指向 Target HTML Element): Svelte 實例在被創建后,就會直接將內容渲染到這個目標 HTML 元素中。

四、樣式管理

無論 React 還是 Vue,樣式管理都是一個需要注意的問題。

  1. Bytemd 和 Highlight.js 的核心 CSS:
    這些樣式是 Svelte Bytemd Viewer 正常工作和代碼高亮所必需的。它們通常需要全局導入,例如:

    • 在 React (Next.js) 的 src/app/globals.css 中:
      @import 'bytemd/dist/index.css';
      @import 'highlight.js/styles/github.css'; /* 或 atom-one-dark.css 等 */
      
    • 在 Vue 項目的 src/main.tssrc/App.vue 中:
      // main.ts
      import 'bytemd/dist/index.css';
      import 'highlight.js/styles/github.css';
      
  2. 宿主框架 Wrapper 組件的樣式:

    • React (CSS Modules):AIDialogContent.module.css 中,您可以定義針對 <div ref={containerRef} className={className}> 的樣式。
    • React (:global() 偽類): 為了覆蓋 Bytemd Viewer 內部渲染出的 HTML 元素的樣式(例如 h1, p, pre, code 等),您需要在 CSS Modules 文件中使用 :global() 偽類,確保這些樣式能作用于 Svelte 插入的 DOM 元素。例如:
      /* AIDialogContent.module.css */
      .aiMarkdownContent :global(.bytemd-viewer) {/* 覆蓋 bytemd 默認容器樣式 */padding: 0 !important;margin: 0 !important;/* ... 其他通用樣式 ... */
      }
      .aiMarkdownContent :global(.bytemd-viewer pre) {/* 覆蓋 bytemd 內部代碼塊樣式 */background-color: #f5f5f5 !important;/* ... */
      }
      
    • Vue (<style>scoped): 在 Vue 單文件組件中,可以使用一個非 scoped<style> 塊來定義針對 Bytemd Viewer 內部元素的全局樣式,這與 React 的 :global() 效果類似。
      <style> /* 注意:這里沒有 scoped */
      .bytemd-viewer { /* ... */ }
      .bytemd-viewer pre { /* ... */ }
      </style>
      

通過這些詳細的解釋、代碼示例和示意圖,您可以向面試官清晰地闡述您對跨框架組件集成問題的理解和解決方案。


您問得非常好!理解 @bytemd/react 的底層實現,實際上就是理解 如何將一個 Svelte 組件封裝成一個符合 React 生態的組件。這正是我們之前討論的“適配器(Wrapper)模式”的官方、更完善的實現。

五、 @bytemd/react 底層實現原理

@bytemd/react 包的核心目標是讓 Bytemd(其核心 ViewerEditor 是 Svelte 組件)在 React 應用中像一個原生的 React 組件一樣被使用。它的底層實現正是基于 React Hooks (特別是 useRefuseEffect) 來管理 Svelte 組件的生命周期和數據同步。

我們可以將 @bytemd/react 組件的實現抽象為以下幾個關鍵部分:

  1. 引入 Svelte Core Component: 它會從 bytemd/lib/viewerbytemd/lib/editor 導入 Svelte 編譯后的核心組件類。
  2. 創建 DOM 掛載點: 在 React 組件的 render 方法(或者函數組件的返回值)中,會渲染一個簡單的 div 元素作為 Svelte 組件的掛載目標。
  3. 使用 useRef 獲取 DOM 引用: useRef 鉤子用于獲取到這個 div 元素的真實 DOM 節點引用。
  4. 使用 useEffect 管理 Svelte 實例生命周期: 這是最核心的部分。useEffect 用于處理 Svelte 組件的:
    • 初始化掛載:useEffect 的第一次執行時(mount 階段),如果掛載點 DOM 元素存在且 Svelte 實例尚未創建,它會使用 new SvelteBytemdViewer({ target: domElement, props: initialProps })new SvelteBytemdEditor(...) 來實例化 Svelte 組件,并將其掛載到 div 元素上。Svelte 實例會被存儲在一個 useRef 變量中,以便后續訪問。
    • 屬性更新 ($set): useEffect 的依賴數組會包含 React 組件的 props (例如 value, plugins 等)。當這些 props 發生變化時,useEffect 會再次執行,此時會調用 Svelte 實例的 $set(newProps) 方法來更新 Svelte 組件內部的數據。Svelte 的 $set 方法會高效地更新其內部狀態并反映到 DOM 上。
    • 事件監聽與傳遞: Svelte 組件會發出一些事件(例如 change, blur)。@bytemd/react 會在 Svelte 實例初始化時,使用 Svelte 實例的 $on() 方法監聽這些事件,然后將它們包裝成 React 事件回調(例如 onChange, onBlur),并通過 React 的 props 傳遞給父組件。
    • 清理 ($destroy): useEffect 的返回函數會在 React 組件卸載時執行。此時,它會調用 Svelte 實例的 $destroy() 方法,正確地銷毀 Svelte 組件,移除其創建的所有 DOM 元素和事件監聽器,防止內存泄漏。
  5. 插件和配置傳遞: React 組件接收到的 plugins 數組和任何其他 Bytemd 配置會直接傳遞給 Svelte 實例的 props

簡化代碼示例 (概念性實現)

為了更好地理解,我們可以想象 @bytemd/react 內部可能類似于我們手動實現的 ByteMarkdownViewer,但更健壯,并處理了更多的細節,如事件監聽。

// 概念性的 `@bytemd/react` 內部實現簡化版
// 并非 bytemd 官方源碼,僅為說明原理import React, { useRef, useEffect } from 'react';
// 假設這是 Svelte 核心 Viewer 組件的實際編譯后文件
import SvelteBytemdViewer from 'bytemd/lib/viewer'; // 或 bytemd/lib/editor// 定義 bytemd 支持的所有 props 和 events
interface BytemdReactViewerProps {value: string;plugins?: any[];// 其他 Viewer/Editor 支持的 props...// 事件回調,例如:onChange?: (value: string) => void;onReady?: () => void;// ...
}const BytemdReactViewer: React.FC<BytemdReactViewerProps> = ({value,plugins = [],onChange,onReady,// ... 其他 props
}) => {const containerRef = useRef<HTMLDivElement>(null);const svelteInstanceRef = useRef<any>(null); // 存儲 Svelte 實例useEffect(() => {// ------------------------------------// 1. 初始化 Svelte 實例 (Mounting Phase)// ------------------------------------if (containerRef.current && !svelteInstanceRef.current) {svelteInstanceRef.current = new SvelteBytemdViewer({target: containerRef.current,props: {value: value,plugins: plugins,// 其他初始 props},});// ------------------------------------// 2. 監聽 Svelte 內部事件并橋接到 React 回調// ------------------------------------const svelteInstance = svelteInstanceRef.current;if (onChange) {svelteInstance.$on('change', (e: CustomEvent) => onChange(e.detail.value));}if (onReady) {svelteInstance.$on('ready', onReady); // 假設 Svelte Viewer 有 'ready' 事件}// ... 監聽其他 Svelte 事件}// ------------------------------------// 3. 更新 Svelte 實例的 props (Updating Phase)// ------------------------------------else if (svelteInstanceRef.current) {svelteInstanceRef.current.$set({value: value,plugins: plugins, // 確保 plugins 也能響應式更新// ... 其他更新的 props});}// ------------------------------------// 4. 清理 Svelte 實例 (Unmounting Phase)// ------------------------------------return () => {if (svelteInstanceRef.current) {svelteInstanceRef.current.$destroy();svelteInstanceRef.current = null;}};}, [value, plugins, onChange, onReady /* ... 其他需要同步的 props */]);// 依賴數組包含所有需要觸發更新或事件綁定的 propsreturn <div ref={containerRef} />;
};export default BytemdReactViewer;

總結

@bytemd/react 的底層實現本質上就是一個精心設計的 React 組件,充當 Svelte Bytemd 核心組件的適配器。它利用 React 的 useRef 來獲取 DOM 引用,并巧妙地利用 useEffect 鉤子來:

  • 實例化 Svelte 組件 (new SvelteBytemdViewer(...))。
  • 同步更新 Svelte 組件的 props ($set(...))。
  • 橋接和轉發 Svelte 內部的事件到 React 的事件回調 ($on(...))。
  • 正確銷毀 Svelte 組件實例 ($destroy()),以確保資源釋放和性能優化。

這種模式是前端領域中處理跨框架組件重用的標準做法,既保證了功能,又提供了符合宿主框架(React)習慣的 API 體驗。同時,它也要求用戶手動導入 bytemdhighlight.js 的全局 CSS,因為這些樣式是 Svelte 組件渲染其內容的視覺基礎。

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

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

相關文章

【新品解讀】高性能緊湊型 RFSoC FPGA 開發平臺 AXW22,重塑射頻開發體驗

如果您正在煩惱如何在有限的物理空間和預算內&#xff0c;依然實現卓越的射頻帶寬與處理能力&#xff0c;ALINX 基于 AMD RFSoC FPGA 開發板 AXW22 正是為您準備的。 &#xff08;AMD Zynq UltraScale RFSoC FPGA 射頻開發平臺 AXW22&#xff09; 和所有 RFSoC 平臺一樣&#…

Spring @ModelAttribute注解全解析:數據綁定與模型管理

Spring 的 @ModelAttribute 注解主要用于數據綁定和模型屬性管理,支持方法級別和參數級別的應用,以下是其核心特性和使用場景: ?? 一、核心功能 數據綁定 將 HTTP 請求參數(如表單字段、查詢參數)自動綁定到 Java 對象。支持從請求參數、URI 路徑變量、請求頭等多來源獲…

[project-based-learning] 開源貢獻指南 | 自動化鏈接驗證 | Issue模板規范

第四章&#xff1a;貢獻指南 歡迎回來&#xff01;在上一章《項目分類體系》中&#xff0c;我們探討了README.md文件如何通過編程語言和子類別組織教程&#xff0c;從而提升檢索效率。 現在已了解教程列表的構成&#xff08;《教程列表》&#xff09;、條目編寫規范&#xff…

OSCP備戰-LordOfTheRoot靶機復現步驟

PDF下載&#xff1a; Target-practice/Range at main szjr123/Target-practice 一、靶機描述 靶機地址&#xff1a;https://www.vulnhub.com/entry/lord-of-the-root-101,129/ 靶機難度&#xff1a;中等&#xff08;CTF&#xff09; 靶機描述&#xff1a;這是KoocSec為黑…

蘋果或140億美元收購Perplexity,AI搜索格局面臨重構

據多家媒體報道&#xff0c;蘋果內部高管近期就競購AI初創公司Perplexity的可能性舉行了初步會談。若交易最終達成&#xff0c;可能將以接近140億美元的估值完成&#xff0c;成為蘋果歷史上最大規模的收購案12。盡管討論仍處于早期階段&#xff0c;且蘋果尚未與Perplexity管理層…

屠龍刀策略

該策略是一個針對金融市場的自動化交易策略,主要用于日內交易,特別關注于在中國金融期貨市場(如滬深300指數期貨(IF))的日間交易時段(09:20至15:15)進行操作。下面是該策略核心部分的代碼注解解析: 參數定義 - `Nnn1(5)` 和 `Nnn2(20)`:策略中的兩個參數,用于內部計…

【本機已實現】使用Mac部署Triton服務,使用perf_analyzer、model_analyzer

我們的目標是星辰大海 硬件配置&#xff1a;Apple M224 GB Tirtion實現過程 1??Docker安裝 Tirtion的實現&#xff0c;首先要確保系統上的Docker可用 使用默認源會導致拉取失敗&#xff0c;因為墻 Error response from daemon: Get "https://registry-1.docker.io/v2…

idea依賴下載慢解決

setttings.xml <mirrors><mirror><id>aliyunmaven</id><name>阿里云公共倉庫</name><url>https://maven.aliyun.com/repository/public</url><mirrorOf>*</mirrorOf> <!-- 匹配所有倉庫請求 --></mirr…

C# WPF常用調試工具匯總

除了Live Visual Tree、Live Property Explorer和Snoop外&#xff0c;WPF開發還有多種強大的調試工具。以下是完整的工具集合及其詳細使用方法&#xff1a; 1. WPF Performance Suite (WPF性能分析套件) 簡介 微軟官方提供的專業WPF性能分析工具&#xff0c;包含多個組件用于診…

《Vuejs設計與實現》第 11 章(快速 diff 算法

目錄 11.1 相同的前置元素和后置元素 11.2 判斷是否需要進行 DOM 移動操作 11.3 如何移動元素 11.4 總結 我們將探討第三種用于比較新舊子節點集合的方法&#xff1a;快速Diff算法。 這種算法的速度非常快&#xff0c;最早應用于 ivi 和 inferno 框架&#xff0c;DOM 操作方…

JavaScript 存儲對象 sessionStorage (會話存儲) 和 localStorage(本地存儲)

深入理解 localStorage localStorage 是瀏覽器提供的一種客戶端存儲機制&#xff0c;用于在用戶瀏覽器中存儲鍵值對數據。與 cookie 相比&#xff0c;它提供了更大的存儲容量&#xff08;通常為 5-10MB&#xff09;&#xff0c;并且不會隨 HTTP 請求發送到服務器&#xff0c;因…

Z-Ant開源程序是簡化了微處理器上神經網絡的部署和優化

?一、軟件介紹 文末提供程序和源碼下載 Z-Ant &#xff08;Zig-Ant&#xff09; 是一個全面的開源神經網絡框架&#xff0c;專門用于在微控制器和邊緣設備上部署優化的 AI 模型。Z-Ant 使用 Zig 構建&#xff0c;為資源受限的硬件上的模型優化、代碼生成和實時推理提供端到端…

Linux系統---Nginx配置nginx狀態統計

配置Nignx狀態統計 1、下載vts模塊 https://github.com/vozlt/nginx-module-vts [rootclient ~]# nginx -s stop [rootclient ~]# ls anaconda-ks.cfg nginx-1.27.3 ceph-release-1-1.el7.noarch.rpm nginx-1.27.3.tar.gz info.sh …

深入理解 C++ Lambda表達式:四大語法特性 + 六大高頻考點全解析

Lambda表達式是C11引入的一項重要特性&#xff0c;它極大地改變了我們編寫匿名函數的方式。 一、為什么會有Lambda表達式 在C11之前&#xff0c;當我們需要傳遞一個簡單的函數時&#xff0c;通常有以下幾種選擇&#xff1a; 1.1、定義一個單獨的函數 // 單獨定義的比較函數…

SpringBoot 自動化部署實戰:CI/CD 整合方案與避坑全指南

在數字化轉型浪潮席卷全球的當下&#xff0c;企業對軟件交付的速度與質量提出了前所未有的高要求。SpringBoot 憑借其 “約定優于配置” 的特性&#xff0c;成為 Java 領域快速構建應用的熱門框架。而將 SpringBoot 與 CI/CD&#xff08;持續集成 / 持續交付&#xff09;相結合…

JVM字節碼文件結構深度剖析

反匯編&#xff0c;以下命令可以查看相對可讀的詳細結構 javap -verbose ByteCode.class與Class二進制文件并不是直接對齊的 Class二進制文件結構參照表 ClassFile {u4 magic;魔數u2 minor_version;副版本號u2 major_version;主版本號u2…

跟著chrome面板優化頁面性能

沒有優化前&#xff1a; 1.對文本進行壓縮&#xff1a; 重新打包 運行 評分好像還是沒有發生改變&#xff0c;于是我去找別的壓縮的途徑&#xff0c; npm install --save-dev vite-plugin-compression 然后修改vite.config.js文件 導入compression插件 文件夾中也成功出現了…

網上花店微信小程序完整項目

概述 一款功能完善的網上花店微信小程序完整項目。該項目包含了完整的前后端代碼&#xff0c;是一款基于Java技術棧開發的電商類小程序&#xff0c;適合初學者學習的小程序源碼。 主要內容 該花店小程序源碼采用主流技術架構開發&#xff0c;主要功能模塊包括&#xff1a; …

Elasticsearch 搜索的流程

Elasticsearch 的搜索流程是一個分布式協作過程&#xff0c;主要包含 ?查詢階段&#xff08;Query Phase&#xff09;? 和 ?取回階段&#xff08;Fetch Phase&#xff09;?&#xff0c;默認采用 QUERY_THEN_FETCH 模式。以下是詳細流程&#xff1a; 一、請求分發與路由 ?…

用戶行為分析:從概念到實踐的全面指南

在數字化轉型浪潮中&#xff0c;用戶行為分析已成為企業決策的核心驅動力。 用戶行為分析本質上是對用戶與產品交互過程中產生的各類行為數據進行系統性收集、處理和分析&#xff0c;從而揭示用戶偏好、預測行為趨勢并指導業務決策的過程。它包含三層核心要素&#xff1a;行為…