前端全棧修煉手冊:從 Vue3 到工程化的進階之路

本文將全方位覆蓋前端開發的核心知識,從 Vue3 框架的基礎語法到復雜的工程化實踐,從包管理工具的使用到模塊規范的深入理解,帶你踏上從入門到精通的進階之路。

Vue3 框架:新時代前端開發的基石

Vue3 核心語法探秘

Vue3 作為目前最流行的前端框架之一,帶來了諸多令人興奮的新特性和語法改進。其中,組合式 API(Composition API)的引入堪稱革命性的變化,它讓代碼組織更加靈活,邏輯復用更加便捷。

setup函數作為組合式 API 的入口點,替代了 Vue2 中的data、methods等選項。在script setup語法糖的加持下,我們的代碼變得更加簡潔高效。

<template><div class="user-card"><h2>{{ userInfo.name }}</h2><p>年齡:{{ userInfo.age }}</p><button @click="incrementAge">增長年齡</button></div></template><script setup>import { reactive } from 'vue'// 響應式對象const userInfo = reactive({name: 'Allen',age: 28})// 方法定義const incrementAge = () => {userInfo.age++}</script>

在響應式系統方面,Vue3 摒棄了 Vue2 中使用的Object.defineProperty,轉而采用Proxy實現響應式。這一改變帶來了諸多優勢,比如能夠檢測對象的新增和刪除屬性,支持數組索引修改和length變化,以及兼容 Map、Set 等復雜數據結構。

Vue3 提供了ref和reactive兩種創建響應式數據的方式。ref適用于基礎數據類型,而reactive則更適合對象類型。通過toRefs函數,我們可以將reactive創建的響應式對象解構為多個響應式的ref,方便在模板中使用。

import { ref, reactive, toRefs } from 'vue'// 基礎類型響應式const count = ref(0)console.log(count.value) // 訪問值需使用.value// 對象類型響應式const user = reactive({name: 'Allen',age: 28})// 解構響應式對象const { name, age } = toRefs(user)

Vue3 生命周期詳解

生命周期是 Vue 組件從創建到銷毀的整個過程,理解生命周期對于正確管理組件狀態和資源至關重要。Vue3 的生命周期鉤子函數與 Vue2 相比有所變化,并且需要從vue包中導入使用。

組合式 API 鉤子

對應 Vue2 選項式鉤子

執行時機

主要用途

onBeforeMount

beforeMount

組件掛載到 DOM 前

可進行掛載前的最后準備工作

onMounted

mounted

組件掛載到 DOM 后

執行 DOM 操作、初始化第三方庫等

onBeforeUpdate

beforeUpdate

數據更新,DOM 重新渲染前

獲取更新前的 DOM 狀態

onUpdated

updated

DOM 重新渲染后

處理更新后的 DOM 操作

onBeforeUnmount

beforeDestroy

組件卸載前

清理定時器、事件監聽等資源

onUnmounted

destroyed

組件卸載后

完成最終清理工作

onErrorCaptured

-

捕獲子組件錯誤時

錯誤處理和日志記錄

onActivated

-

組件被激活時(配合 KeepAlive)

恢復組件狀態

onDeactivated

-

組件被停用時代(配合 KeepAlive)

保存組件狀態

下面是一個使用生命周期鉤子的示例:

import { onMounted, onUnmounted } from 'vue'onMounted(() => {// 組件掛載后初始化定時器const timer = setInterval(() => {console.log('定時器執行中...')}, 1000)// 在組件卸載前清理定時器onUnmounted(() => {clearInterval(timer)})})

組件通信方式全解析

在 Vue3 中,組件通信方式更加豐富和靈活,滿足不同場景下的需求。

  1. 父子組件通信:使用defineProps和defineEmits
    <!-- 子組件 Child.vue --><template><div><p>{{ message }}</p><button @click="handleClick">點擊傳遞事件</button></div></template><script setup>// 定義接收的propsconst props = defineProps({message: String})// 定義發出的事件const emit = defineEmits(['update:message'])const handleClick = () => {emit('update:message', '來自子組件的消息')}</script>
  2. 跨層級通信:使用provide和inject
    <!-- 祖先組件 Ancestor.vue --><script setup>import { provide } from 'vue'// 提供數據provide('theme', 'dark')// 提供方法provide('changeTheme', (newTheme) => {console.log('主題已切換為:', newTheme)})</script><!-- 深層子組件 DeepChild.vue --><script setup>import { inject } from 'vue'// 注入數據const theme = inject('theme', 'light') // 第二個參數為默認值// 注入方法const changeTheme = inject('changeTheme')</script>
  3. 兄弟組件通信:可以通過共同的父組件中轉,或使用狀態管理工具
  4. 全局狀態管理:使用 Pinia(Vue3 推薦的狀態管理庫)

構建工具:前端工程化的核心引擎

Vue CLI:快速搭建 Vue 項目

Vue CLI 是 Vue 官方提供的腳手架工具,基于 Webpack 構建,能夠快速搭建 Vue 項目骨架。

# 安裝Vue CLInpm install -g @vue/cli# 創建新項目vue create my-vue-project# 啟動開發服務器cd my-vue-projectnpm run serve

Vue CLI 提供了豐富的配置選項和插件生態,支持各種開發需求,但隨著 Vite 的崛起,它在新建項目中的使用率有所下降。

Vite:極速開發體驗的代名詞

Vite 是新一代前端構建工具,由 Vue 作者尤雨溪開發,旨在提供極速的開發體驗。

# 創建Vite項目npm create vite@latest my-vite-project -- --template vue# 進入項目目錄cd my-vite-project# 安裝依賴npm install# 啟動開發服務器npm run dev

Vite 的核心優勢在于:

  1. 開發環境無需打包,基于原生 ES 模塊提供服務
  1. 極速的熱模塊替換(HMR),修改代碼即時生效
  1. 生產環境使用 Rollup 打包,構建產物體積更小
  1. 內置對 TypeScript、JSX、CSS 預處理器的支持

Vite 配置文件(vite.config.js)示例:

import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'export default defineConfig({plugins: [vue()],server: {port: 3000,proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}},build: {outDir: 'dist',assetsDir: 'assets'}})

Webpack:功能強大的模塊打包器

Webpack 是目前使用最廣泛的前端打包工具,雖然配置相對復雜,但功能極其強大,適用于各種復雜項目。

Webpack 核心配置(webpack.config.js)示例:

const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const { VueLoaderPlugin } = require('vue-loader')module.exports = {entry: './src/main.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'js/[name].[contenthash].js',clean: true},module: {rules: [{test: /\.vue$/,use: 'vue-loader'},{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}},{test: /\.css$/,use: ['style-loader', 'css-loader', 'postcss-loader']},{test: /\.(png|jpe?g|gif|svg)$/,type: 'asset/resource',generator: {filename: 'images/[name].[hash:8][ext]'}}]},plugins: [new HtmlWebpackPlugin({template: './public/index.html',filename: 'index.html'}),new VueLoaderPlugin()],optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'}}}},devServer: {port: 8080,hot: true,open: true}}

Webpack 的主要概念包括入口(entry)、輸出(output)、加載器(loader)、插件(plugin)和模式(mode)等,掌握這些概念對于配置和優化 Webpack 至關重要。

包管理工具:項目依賴的管家

npm:前端包管理的基石

npm(Node Package Manager)是 Node.js 默認的包管理工具,也是目前世界上最大的軟件注冊表。

常用 npm 命令:

# 初始化項目npm init -y# 安裝依賴包(生產環境)npm install package-name# 安裝依賴包(開發環境)npm install package-name --save-dev# 全局安裝npm install -g package-name# 卸載依賴npm uninstall package-name# 更新依賴npm update package-name# 運行腳本npm run script-name# 查看依賴樹npm ls

npm 通過package.json文件管理項目依賴和腳本,package-lock.json文件則用于鎖定依賴版本,確保在不同環境下安裝的依賴版本一致。

pnpm:高性能的包管理器

pnpm 是新一代的包管理工具,相比 npm 和 yarn,具有更快的安裝速度和更高效的磁盤利用。

pnpm 的核心優勢:

  1. 采用內容尋址存儲,相同版本的包只存儲一次
  2. 使用硬鏈接和符號鏈接實現依賴共享,節省磁盤空間
  3. 支持 monorepo 項目結構,便于管理多包項目
  4. 嚴格的依賴隔離,避免版本沖突

常用 pnpm 命令:

# 安裝pnpmnpm install -g pnpm# 初始化項目pnpm init# 安裝依賴pnpm add package-name# 安裝開發依賴pnpm add -D package-name# 全局安裝pnpm add -g package-name# 卸載依賴pnpm remove package-name# 更新依賴pnpm update package-name# 運行腳本pnpm run script-name

對于 monorepo 項目,pnpm 通過pnpm-workspace.yaml文件進行配置:

# pnpm-workspace.yamlpackages:- 'packages/*'- 'apps/*'- 'components/*'

YAML:簡潔高效的配置文件格式

YAML 是一種直觀的數據序列化格式,常用于配置文件,相比 JSON 更加簡潔易讀。

YAML 的基本語法規則:

  1. 使用縮進表示層級關系
  2. 使用key: value格式表示鍵值對
  3. 字符串可以不加引號
  4. 使用#表示注釋
  5. 數組使用-開頭

示例(docker-compose.yml):

version: '3'services:web:build: .ports:- "8080:80"volumes:- ./src:/app/srcenvironment:- NODE_ENV=developmentdepends_on:- apiapi:image: node:16command: npm run devvolumes:- ./api:/app

在前端項目中,YAML 常用于 CI/CD 配置、Docker 配置、服務編排等場景。

模塊規范:CommonJS 與 ES Modules

CommonJS(CJS):Node.js 的模塊規范

CommonJS 是 Node.js 采用的模塊規范,主要用于服務器端 JavaScript。

CJS 模塊導出:

// math.jsconst add = (a, b) => a + bconst subtract = (a, b) => a - b// 導出方式1module.exports = {add,subtract}// 導出方式2exports.add = addexports.subtract = subtract

CJS 模塊導入:

// app.js// 導入整個模塊const math = require('./math.js')console.log(math.add(2, 3)) // 5// 解構導入const { subtract } = require('./math.js')console.log(subtract(5, 2)) // 3// 導入內置模塊或第三方模塊const fs = require('fs')const lodash = require('lodash')

CJS 的特性:

  1. 運行時加載:模塊在代碼執行到require語句時才加載
  2. 同步加載:require是同步操作,會阻塞后續代碼執行
  3. 模塊緩存:模塊第一次加載后會被緩存,再次加載直接使用緩存
  4. 值拷貝:對于基本類型是值的拷貝,對于對象是引用

ES Modules(ESM):瀏覽器和現代 JS 的模塊規范

ES Modules 是 ECMAScript 標準的模塊規范,現已被大多數瀏覽器和 Node.js 支持。

ESM 模塊導出:

// math.js// 命名導出export const add = (a, b) => a + bexport const subtract = (a, b) => a - b// 默認導出export default {multiply: (a, b) => a * b,divide: (a, b) => a / b}

ESM 模塊導入:

// app.js// 導入命名導出import { add, subtract } from './math.js'console.log(add(2, 3)) // 5// 導入默認導出import calculator from './math.js'console.log(calculator.multiply(2, 3)) // 6// 重命名導入import { add as sum } from './math.js'// 導入所有命名導出import * as math from './math.js'// 動態導入import('./math.js').then(math => {console.log(math.subtract(5, 2)) // 3})

在 HTML 中使用 ESM:

<script type="module" src="./app.js"></script>

ESM 的特性:

  1. 靜態分析:導入導出在編譯時確定,支持 Tree-shaking
  2. 異步加載:模塊加載不會阻塞 HTML 解析
  3. 動態綁定:導入的模塊內容與導出模塊保持動態關聯
  4. 嚴格模式:默認運行在嚴格模式下

CJS 與 ESM 的主要區別

特性

CommonJS

ES Modules

語法

require()/module.exports

import/export

加載時機

運行時動態加載

編譯時靜態分析

加載方式

同步加載

異步加載

模塊輸出

值的拷貝 / 引用

動態綁定的引用

適用環境

Node.js

瀏覽器和現代 Node.js

頂層 this

指向module.exports

指向undefined

循環依賴

基于緩存的部分加載

基于引用的實時綁定

在實際開發中,我們可以通過 Babel、Webpack、Vite 等工具實現兩種模塊規范的互操作和轉換。

常用前端工具庫:提升開發效率的利器

Axios:強大的 HTTP 客戶端

Axios 是一個基于 Promise 的 HTTP 客戶端,用于瀏覽器和 Node.js 中發送 HTTP 請求。

基本使用:

import axios from 'axios'// 基本GET請求axios.get('/api/users').then(response => {console.log(response.data)}).catch(error => {console.error(error)})// POST請求axios.post('/api/users', {name: 'Allen',age: 28}).then(response => {console.log('用戶創建成功')}).catch(error => {console.error('創建失敗', error)})

創建實例并配置攔截器:

import axios from 'axios'// 創建實例const api = axios.create({baseURL: 'https://api.example.com',timeout: 5000,headers: {'Content-Type': 'application/json'}})// 請求攔截器api.interceptors.request.use(config => {// 添加認證tokenconst token = localStorage.getItem('token')if (token) {config.headers.Authorization = `Bearer ${token}`}return config},error => {return Promise.reject(error)})// 響應攔截器api.interceptors.response.use(response => {return response.data},error => {// 處理錯誤if (error.response && error.response.status === 401) {// 未授權,跳轉到登錄頁location.href = '/login'}return Promise.reject(error)})// 使用實例api.get('/users').then(data => {console.log(data)})

Lodash:實用的 JavaScript 工具庫

Lodash 提供了大量實用的函數,簡化了數組、對象、字符串等數據類型的操作。

常用功能示例:

import { debounce, throttle, cloneDeep, get, set } from 'lodash'// 防抖:頻繁觸發后,只執行最后一次const handleSearch = debounce((keyword) => {console.log('搜索:', keyword)}, 300)// 節流:指定時間內只執行一次const handleScroll = throttle(() => {console.log('滾動事件')}, 100)// 深拷貝const obj = { a: 1, b: { c: 2 } }const objCopy = cloneDeep(obj)// 安全獲取對象屬性const user = { info: { name: 'Allen' } }const userName = get(user, 'info.name', 'Guest') // 'Allen'const age = get(user, 'info.age', 0) // 0// 設置對象屬性set(user, 'info.age', 28)console.log(user.info.age) // 28

Date-fns:現代 JavaScript 日期工具庫

Date-fns 是一個輕量級的日期處理庫,提供了大量處理日期的函數。

常用功能示例:

import { format, addDays, differenceInDays, parseISO } from 'date-fns'// 格式化日期const today = new Date()console.log(format(today, 'yyyy-MM-dd')) // 2023-10-15console.log(format(today, 'MMMM do, yyyy')) // October 15th, 2023// 日期計算const tomorrow = addDays(today, 1)console.log(format(tomorrow, 'yyyy-MM-dd')) // 2023-10-16// 日期差計算const nextWeek = addDays(today, 7)console.log(differenceInDays(nextWeek, today)) // 7// 解析ISO格式日期const isoDate = '2023-12-25T08:00:00Z'const date = parseISO(isoDate)console.log(format(date, 'yyyy年MM月dd日')) // 2023年12月25日

核心概念:前端開發的基石

Cookie:客戶端存儲的基礎

Cookie 是存儲在客戶端的小型文本數據,常用于身份認證、會話管理等。

操作 Cookie 的工具函數:

// 設置Cookiefunction setCookie(name, value, days = 7, path = '/') {const date = new Date()date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000))const expires = `expires=${date.toUTCString()}`document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}; path=${path}; SameSite=Lax`}// 獲取Cookiefunction getCookie(name) {const nameEQ = `${name}=`const cookies = document.cookie.split(';')for (let i = 0; i < cookies.length; i++) {let cookie = cookies[i].trim()if (cookie.indexOf(nameEQ) === 0) {return decodeURIComponent(cookie.substring(nameEQ.length))}}return null}// 刪除Cookiefunction deleteCookie(name, path = '/') {setCookie(name, '', -1, path)}// 使用示例setCookie('token', 'jwt-token-here', 7)const token = getCookie('token')// 刪除Cookie// deleteCookie('token')

Cookie 的特性:

  1. 大小限制:通常為 4KB 左右
  2. 過期時間:可以設置過期時間,否則為會話 Cookie
  3. 域名限制:Cookie 僅發送到設置它的域名
  4. 路徑限制:可以限制 Cookie 僅在特定路徑下有效
  5. 隨請求發送:每次請求都會自動攜帶 Cookie
  6. 安全性選項:Secure(僅 HTTPS 傳輸)、HttpOnly(禁止 JS 訪問)、SameSite(防止 CSRF 攻擊)

遞歸:解決復雜問題的利器

遞歸是指函數調用自身的編程技巧,常用于解決樹形結構、排列組合等問題。

  1. 深度遞歸遍歷樹形結構:
    // 樹形數據const tree = [{id: 1,name: '節點1',children: [{id: 11,name: '節點1-1',children: [{ id: 111, name: '節點1-1-1' },{ id: 112, name: '節點1-1-2' }]},{ id: 12, name: '節點1-2' }]},{ id: 2, name: '節點2' }]// 深度遞歸遍歷function deepTraverse(node, level = 0) {if (!node) return// 處理當前節點console.log(`${' '.repeat(level)}${node.name}`)// 遞歸處理子節點if (node.children && node.children.length) {node.children.forEach(child => {deepTraverse(child, level + 1)})}}// 遍歷整個樹tree.forEach(rootNode => {deepTraverse(rootNode)})
  2. 廣度遞歸遍歷樹形結構:
    // 廣度遍歷function breadthTraverse(tree) {if (!tree || !tree.length) return// 使用隊列存儲節點const queue = [...tree]let level = 0while (queue.length > 0) {// 獲取當前層級的節點數量const levelSize = queue.lengthconsole.log(`層級 ${level}:`)// 處理當前層級的所有節點for (let i = 0; i < levelSize; i++) {const node = queue.shift()console.log(` ${node.name}`)// 將子節點加入隊列if (node.children && node.children.length) {queue.push(...node.children)}}level++}}// 使用示例breadthTraverse(tree)
  3. 多維數組遍歷:
    // 多維數組const multiArray = [1,[2, 3],[4, [5, 6], 7],[8, [9, [10, 11], 12]]]// 遞歸扁平化多維數組function flattenArray(arr) {let result = []arr.forEach(item => {if (Array.isArray(item)) {// 遞歸處理子數組result = result.concat(flattenArray(item))} else {result.push(item)}})return result}// 使用示例const flatArray = flattenArray(multiArray)console.log(flatArray) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

閉包:JavaScript 的高級特性

閉包是指函數能夠訪問其詞法作用域之外的變量,即使函數在其詞法作用域之外執行。

閉包的常見應用:

  1. 創建私有變量和方法:
    function createCounter() {// 私有變量let count = 0// 返回閉包函數return {increment: () => {count++return count},decrement: () => {count--return count},getCount: () => count,reset: () => {count = 0return count}}}// 使用示例const counter = createCounter()console.log(counter.increment()) // 1console.log(counter.increment()) // 2console.log(counter.decrement()) // 1console.log(counter.getCount()) // 1console.log(counter.reset()) // 0
  2. 函數工廠:
    // 創建打招呼函數的工廠function createGreeter(greeting) {// greeting 被閉包捕獲return function(name) {return `${greeting}, ${name}!`}}// 創建不同的打招呼函數const sayHello = createGreeter('Hello')const sayHi = createGreeter('Hi')const sayBonjour = createGreeter('Bonjour')console.log(sayHello('Allen')) // Hello, Allen!console.log(sayHi('World')) // Hi, World!console.log(sayBonjour('Alice')) // Bonjour, Alice!
  3. 緩存計算結果:
    function createCacheFunction(calculator) {const cache = new Map()return function(arg) {// 檢查緩存if (cache.has(arg)) {console.log('使用緩存結果')return cache.get(arg)}// 計算并緩存結果const result = calculator(arg)cache.set(arg, result)return result}}// 復雜計算函數function expensiveCalculation(n) {console.log('執行復雜計算')let result = 0for (let i = 0; i <= n; i++) {result += i}return result}// 創建帶緩存的計算函數const cachedCalculation = createCacheFunction(expensiveCalculation)console.log(cachedCalculation(1000)) // 執行復雜計算,返回結果console.log(cachedCalculation(1000)) // 使用緩存結果,返回結果console.log(cachedCalculation(2000)) // 執行復雜計算,返回結果console.log(cachedCalculation(2000)) // 使用緩存結果,返回結果

前端工程化進階:提升項目質量與效率

TypeScript:增強 JavaScript 的類型系統(具體可前往:TypeScript:融合 JS、ES6 與 Vue3 的前端開發新范式-CSDN博客)

TypeScript 是 JavaScript 的超集,添加了靜態類型系統,提供更好的代碼提示和類型檢查。

在 Vue3 中使用 TypeScript:

<!-- UserComponent.vue --><template><div><h2>{{ user.name }}</h2><p>年齡:{{ user.age }}</p><p>郵箱:{{ user.email }}</p></div></template><script setup lang="ts">import { ref } from 'vue'// 定義接口interface User {id: numbername: stringage: numberemail?: string // 可選屬性}// 定義變量并指定類型const user: User = {id: 1,name: 'Allen',age: 28,email: 'allen@example.com'}// 定義函數類型type GreetFunction = (name: string) => stringconst greet: GreetFunction = (name) => {return `Hello, ${name}!`}console.log(greet(user.name))</script>

ESLint 與 Prettier:代碼質量與格式化

ESLint 用于代碼質量檢查,Prettier 用于代碼格式化,兩者結合可以有效提升代碼質量和一致性。

ESLint 配置(.eslintrc.js):

module.exports = {root: true,env: {browser: true,es2021: true,node: true},extends: ['eslint:recommended','plugin:vue/vue3-recommended','plugin:@typescript-eslint/recommended','prettier'],parser: 'vue-eslint-parser',parserOptions: {ecmaVersion: 'latest',parser: '@typescript-eslint/parser',sourceType: 'module'},plugins: ['vue','@typescript-eslint'],rules: {'vue/multi-word-component-names': 'off','no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off','no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off','@typescript-eslint/explicit-module-boundary-types': 'off'}}

Prettier 配置(.prettierrc):

{"singleQuote": true,"semi": true,"tabWidth": 2,"trailingComma": "es5","printWidth": 100,"arrowParens": "always"}

前端性能優化:提升用戶體驗

前端性能優化是提升用戶體驗的關鍵,主要包括以下幾個方面:

? ? 1.加載優化:

    • 代碼分割(Code Splitting)
    • 懶加載(路由懶加載、圖片懶加載)
    • 資源壓縮與混淆
    • 使用 CDN 加速

? ? 2.渲染優化:

    • 減少 DOM 操作
    • 使用虛擬列表處理大數據渲染
    • 避免重排重繪
    • 使用 CSS 硬件加速

? ? 3.緩存策略:

    • HTTP 緩存(強緩存、協商緩存)
    • Service Worker 緩存
    • 本地存儲合理使用

? ? 4.Vue3 性能優化(善用v- ,具體可前往vue官網查看手冊):

    • 使用v-memo緩存組件
    • 合理使用setup緩存計算結果
    • 避免不必要的響應式數據
    • 使用teleport優化模態框性能

結語

前端開發領域廣闊且不斷發展,從 Vue3 框架到工程化工具,從基礎語法到高級概念,每一個知識點都值得深入學習和實踐。本文涵蓋了前端開發的核心知識,但學習之路永無止境。希望本文能成為你前端進階之路上的良師益友,幫助你構建完整的知識體系,在前端開發的道路上不斷進步,創造出更加優秀的 web 應用。記住,持續學習和實踐是成為優秀前端工程師的關鍵,祝你在前端的世界里不斷探索,收獲成長!

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

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

相關文章

Jetpack Compose 常用控件

Jetpack Compose 常用控件一、基礎展示控件&#xff1a;呈現靜態內容二、交互控件&#xff1a;響應用戶操作三、列表與網格控件&#xff1a;展示大量數據四、導航與標簽控件&#xff1a;組織頁面結構五、反饋控件&#xff1a;提示與加載狀態六、布局控件&#xff1a;組織 UI 結…

Android適配最新SplashScreen方案:讓啟動頁不再“翻車“

Android適配最新SplashScreen方案:讓啟動頁不再"翻車" 各位開發者大佬們,最近是不是又被Android的SplashScreen適配搞得焦頭爛額?別慌,今天咱們就來聊聊這個讓人又愛又恨的啟動頁適配方案,保證讓你笑出腹肌的同時,還能把技術要點牢牢掌握![6][7][9][10] 一、…

【自動駕駛】《Sparse4Dv3》代碼學習筆記

這里時間比較有限&#xff0c;優先看Sparse4Dv3方法里面相對以前改動的地方。 0.參考 代碼v1/v2/v3:https://github.com/HorizonRobotics/Sparse4D 跑起來&#xff1a;https://github.com/HorizonRobotics/Sparse4D/blob/v3.0/docs/quick_start.md 1.方法 &#xff08;1&a…

「ECG信號處理——(22)Pan-Tompkins Findpeak 閾值檢測 差分閾值算法——三種R波檢測算法對比分析」2025年8月8日

目錄 1、引言 2、算法原理 &#xff08;1&#xff09;Pan-Tompkins 算法&#xff08;方法1&#xff09; &#xff08;2&#xff09;Findpeak 閾值檢測算法&#xff08;方法2&#xff09; &#xff08;3&#xff09;差分閾值算法&#xff08;方法3&#xff09; 3、算法性能…

Qdrant Filtering:must / should / must_not 全解析(含 Python 實操)

在向量搜索中&#xff0c;過濾&#xff08;Filtering&#xff09; 是保證結果精準性和業務契合度的關鍵手段。Qdrant 的過濾機制不僅能在向量相似度檢索的基礎上疊加結構化條件&#xff0c;還提供了靈活的布爾邏輯組合&#xff0c;讓我們可以像寫數據庫查詢一樣&#xff0c;精準…

五、RuoYi-Cloud-Plus 前端項目部署以及如何改后端請求地址。

1.前情描述 前面的文章我們介紹了RuoYi-Cloud-Plus的nocos的配置內容&#xff0c;已經啟動其他服務要注意什么東西。 專欄內容在這&#xff0c;感興趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.前端項目部署。 官網地址&#xff1a;plus…

工作量評估

工作量評估 API 工作量評估&#xff1a; 得分 入參個數 * 0.2 業務規則 * 0.5 改動的庫表個數 * 0.3 得分&#xff08;1-2&#xff09;&#xff1a;簡單API-5人天 得分&#xff08;3-8&#xff09;&#xff1a;中等API-8人天 得分&#xff08;8-15&#xff09;&#xff1a;復…

籃球運動(動態規劃)

題目描述小明建造了一個籃球場&#xff0c;他請來了2行n列的人&#xff0c;想讓他們進行比賽。每一個人都有一個能力值&#xff0c;第一行分別為h11&#xff0c;h12&#xff0c;…&#xff0c;h1n&#xff0c;第二行為h21&#xff0c;h22&#xff0c;…&#xff0c;h2n。現在小…

區塊鏈與大數據分析技術深度解析

目錄 區塊鏈與大數據分析技術深度解析 1. 引言:當區塊鏈遇見大數據 2. 區塊鏈數據特性 2.1 數據結構差異 2.2 區塊鏈數據層級 3. 數據獲取技術 3.1 節點直連方案 3.2 鏈上數據湖架構 4. 數據分析關鍵技術 4.1 交易圖譜分析 4.2 地址聚類算法 5. 鏈上分析應用場景 5.1 反洗錢(A…

網絡基礎——網絡層級

OSI七層模型OSI七層模型名稱功能協議應用層直接為用戶應用程序&#xff08;如瀏覽器、郵件客戶端&#xff09;提供網絡服務接口。HTTP/HTTPS&#xff08;網頁瀏覽&#xff09;FTP&#xff08;文件傳輸&#xff09;SMTP/POP3&#xff08;郵件&#xff09;DNS&#xff08;域名解析…

【Redis】hash哈希,List列表

目錄 一. hash哈希 1.1.常用命令 1.1.1.HSET 1.1.2.HGET 1.1.3.HEXISTS 1.1.4.HDEL 1.1.5.HKEYS 1.1.6.HVALS 1.1.7.HGETALL 1.1.8.HMGET 1.1.9.HLEN 1.1.10.HSETNX 1.1.11.HINCRBY 1.1.12.HINCRBYFLOAT 1.2. 內部編碼 1.3. 使用場景 1.4…

MySQL相關概念和易錯知識點(4)(分組查詢、連接查詢、合并查詢、子查詢)

目錄1.分組查詢&#xff08;1&#xff09;聚合函數&#xff08;2&#xff09;group by子句&#xff08;3&#xff09;having2.連接查詢&#xff08;1&#xff09;內連接&#xff08;笛卡爾積&#xff09;&#xff08;2&#xff09;外連接&#xff08;3&#xff09;內外連接的區…

【Python 高頻 API 速學 ①】

一、為什么先學它們&#xff1f; 在真實代碼里&#xff0c;90 % 的 bug 都源于「拿到的是 A 類型&#xff0c;卻當成 B 類型用」。 把「不確定」變成「確定」——這就是類型轉換三兄弟的核心價值。二、三兄弟速覽函數一句話定位常見輸入失敗會怎樣int(x)把 x 變成整數‘42’, 3…

FFmpeg 視頻旋轉信息處理:3.4 vs 7.0.2

1. 概述 FFmpeg 在處理視頻旋轉信息方面經歷了重要的架構變化。本文檔詳細對比了 FFmpeg 3.4 和 7.0.2 在封裝&#xff08;muxing&#xff09;和解封裝&#xff08;demuxing&#xff09;視頻旋轉信息時的差異&#xff0c;并提供兼容性解決方案。文檔內容由Claude Sonnet 4輔助撰…

《Resolving tissue complexity by multimodal spatial omics modeling with MISO》

概念多模態空間組學&#xff1a;簡單來說&#xff0c;就是同時研究生物組織里的多種分子信息&#xff08;比如基因表達、蛋白質、代謝物、表觀遺傳標記等&#xff09;&#xff0c;而且這些信息還帶有空間位置。MISO&#xff08;MultI-modal Spatial Omics&#xff09;是這篇論文…

三階段提交(3PC)協議的全面解析:理論、機制與實踐局限性

第一部分&#xff1a;非阻塞提交的起源&#xff1a;從兩階段提交&#xff08;2PC&#xff09;的缺陷到三階段提交&#xff08;3PC&#xff09;的構想在分布式計算領域&#xff0c;確保跨多個獨立節點執行的事務的完整性是一項至關重要的挑戰。這些節點或站點可能在地理上分散&a…

衰減器的計算

pi型衰減器&#xff0c;如下圖所示。 它適用于輸入輸出阻抗匹配的情況下&#xff0c;還能進行衰減。 不過當輸入輸出阻抗不匹配時&#xff0c;2個R1也會不相等。 已知特性阻抗Z0&#xff0c;衰減比AVin/Vout&#xff0c;怎么計算R1、R2&#xff1f; 1、電阻分壓。 Vout Vi…

Day02 員工管理,分類管理

新增員工需求分析和設計產品原型&#xff1a;接口設計&#xff1a;本項目約定&#xff1a;管理端發出的請求&#xff0c;統一使用 /admin 作為前綴用戶端發出的請求&#xff0c;統一使用 /user 作為前綴數據庫表設計&#xff1a;代碼開發根據新增員工接口設計對應的 DTO&#x…

[SC]SystemC 常見的編譯/語法錯誤與解法(三)

SystemC 常見的編譯/語法錯誤與解法(三) 摘要:下面按“現象/編譯信息 → 成因 → 解決方案”的結構,歸納 SystemC 建模在 SoC 驗證中常見的“編譯期/語法層面”問題,并補充如何根據編譯信息快速定位與如何在流程上避免這些問題。 一、SystemC 常見的編譯/語法錯誤與…

06-docker容器常用命令

文章目錄一.docker容器相關指令概述二.生產環境中常用的 docker容器相關指令1.創建容器(create)2.查看已創建的容器(ps&#xff0c;ls&#xff0c;list)3.運行一個已創建的容器(start)4.停止一個正在運行的容器(stop)5.重啟容器(restart)6.創建并啟動一個容器(run&#xff0c;等…