🌏浏览器硬件API大全:30个颠覆性技术让你重新认识Web开发

从AI推理到量子计算,这些API正在重新定义"浏览器能做什么"

一、WebUSB API:直接访问USB设备

设备连接与控制

javascript 复制代码
// 请求USB设备权限
const device = await navigator.usb.requestDevice({
  filters: [{ vendorId: 0x1234 }]
});

// 打开设备并传输数据
await device.open();
await device.selectConfiguration(1);
await device.claimInterface(0);

// 批量数据传输
const result = await device.transferIn(1, 64);
console.log('接收数据:', new Uint8Array(result.data.buffer));

兼容性分析:

  • ✅ Chrome 61+ (需要HTTPS)
  • ✅ Edge 79+
  • ❌ Firefox (未支持)
  • ❌ Safari (未支持)

二、WebBluetooth API:蓝牙设备交互

低功耗蓝牙连接

javascript 复制代码
// 扫描并连接蓝牙设备
const device = await navigator.bluetooth.requestDevice({
  filters: [{ services: ['battery_service'] }]
});

const server = await device.gatt.connect();
const service = await server.getPrimaryService('battery_service');
const characteristic = await service.getCharacteristic('battery_level');

// 读取电池电量
const value = await characteristic.readValue();
console.log('电池电量:', value.getUint8(0), '%');

兼容性状况:

  • ✅ Chrome 56+ (需要HTTPS)
  • ✅ Edge 79+
  • ❌ Firefox (未支持)
  • ❌ Safari (iOS 13+部分支持)

三、Web Serial API:串口通信

串口设备通信

javascript 复制代码
// 请求串口访问权限
const port = await navigator.serial.requestPort();
await port.open({ baudRate: 9600 });

const writer = port.writable.getWriter();
const encoder = new TextEncoder();

// 发送数据
await writer.write(encoder.encode('Hello Serial!'));

// 读取数据
const reader = port.readable.getReader();
while (true) {
  const { value, done } = await reader.read();
  if (done) break;
  console.log('收到数据:', new TextDecoder().decode(value));
}

兼容性评估:

  • ✅ Chrome 89+
  • ✅ Edge 89+
  • ❌ Firefox (未支持)
  • ❌ Safari (未支持)

四、WebHID API:人机接口设备

游戏手柄和输入设备

javascript 复制代码
// 请求HID设备访问
const devices = await navigator.hid.requestDevice({
  filters: [{ usagePage: 0x01, usage: 0x05 }] // 游戏手柄
});

const device = devices[0];
await device.open();

// 监听输入事件
device.addEventListener('inputreport', event => {
  const data = new Uint8Array(event.data.buffer);
  console.log('手柄输入:', data);
  
  if (data[0] === 1) {
    // A按钮按下
    handleButtonPress('A');
  }
});

兼容性总结:

  • ✅ Chrome 89+
  • ✅ Edge 89+
  • ❌ Firefox (未支持)
  • ❌ Safari (未支持)

五、Web NFC API:近场通信

NFC标签读写

javascript 复制代码
// 检测NFC支持
if ('NDEFReader' in window) {
  const nfc = new NDEFReader();
  
  // 读取NFC标签
  try {
    await nfc.scan();
    nfc.onreading = event => {
      console.log('NFC标签ID:', event.serialNumber);
      for (const record of event.message.records) {
        console.log('记录类型:', record.recordType);
        console.log('数据:', record.data);
      }
    };
  } catch (error) {
    console.log('NFC错误:', error);
  }
  
  // 写入NFC标签
  await nfc.write({
    records: [{ recordType: "text", data: "Hello NFC!" }]
  });
}

兼容性:

  • ✅ Chrome 89+ (Android)
  • ✅ Edge 89+
  • ❌ Firefox (未支持)
  • ❌ Safari (未支持)

六、Web MIDI API:音乐设备数字接口

MIDI设备控制

javascript 复制代码
// 请求MIDI设备访问
if (navigator.requestMIDIAccess) {
  const midiAccess = await navigator.requestMIDIAccess();
  
  // 监听所有MIDI输入设备
  for (const input of midiAccess.inputs.values()) {
    input.onmidimessage = event => {
      const [command, note, velocity] = event.data;
      console.log('MIDI消息:', { command, note, velocity });
      
      if (command === 144) { // 音符开始
        playNote(note, velocity);
      } else if (command === 128) { // 音符结束
        stopNote(note);
      }
    };
  }
  
  // 发送MIDI消息到输出设备
  for (const output of midiAccess.outputs.values()) {
    output.send([0x90, 60, 0x7f]); // 播放中央C音符
  }
}

兼容性:

  • ✅ Chrome 43+
  • ✅ Edge 79+
  • ✅ Firefox (实验性支持)
  • ✅ Safari 10.1+

七、WebGPU API:下一代图形计算(已全面支持)

GPU加速计算和渲染

javascript 复制代码
// 初始化WebGPU(现代写法)
async function initWebGPU() {
  if (!navigator.gpu) {
    throw new Error('WebGPU not supported');
  }
  
  const adapter = await navigator.gpu.requestAdapter();
  const device = await adapter.requestDevice();
  
  // 创建计算管线
  const computePipeline = device.createComputePipeline({
    layout: 'auto',
    compute: {
      module: device.createShaderModule({
        code: `
          @compute @workgroup_size(64)
          fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
            // GPU并行计算代码
          }
        `
      }),
      entryPoint: 'main'
    }
  });
  
  return { device, computePipeline };
}

兼容性分析(2025年更新):

  • ✅ Chrome 113+ (默认开启)
  • ✅ Edge 113+ (默认开启)
  • ✅ Firefox 121+ (实验性支持)
  • ✅ Safari 17+ (通过WebGPU)

八、WebNN API:神经网络推理(重大更新)

浏览器内AI推理

javascript 复制代码
// 现代WebNN用法
async function runInference() {
  const context = await navigator.ml.createContext();
  
  // 创建模型并设置输入
  const builder = new MLGraphBuilder(context);
  const input = builder.input('input', { type: 'float32', dimensions: [1, 224, 224, 3] });
  
  // 构建模型图
  const output = builder.softmax(builder.matmul(input, weights));
  const graph = await builder.build({ output });
  
  // 执行推理
  const results = await graph.compute({
    'input': inputTensor
  });
  
  return results.output;
}

兼容性状况(2025年):

  • ✅ Chrome 115+ (稳定支持)
  • ✅ Edge 115+
  • 🔶 Firefox (通过WebAssembly模拟)
  • 🔶 Safari (通过Core ML集成)

九、WebXR API:虚拟和增强现实(体验优化)

VR/AR体验

javascript 复制代码
// 现代WebXR最佳实践
async function initXR() {
  if (!navigator.xr) {
    return console.error('WebXR not supported');
  }
  
  // 检测XR支持
  const supported = await navigator.xr.isSessionSupported('immersive-vr');
  if (!supported) {
    return console.error('VR not supported');
  }
  
  // 创建XR会话
  const session = await navigator.xr.requestSession('immersive-vr', {
    requiredFeatures: ['local-floor', 'bounded-floor'],
    optionalFeatures: ['hand-tracking']
  });
  
  // 设置渲染循环
  session.requestAnimationFrame(onXRFrame);
  
  async function onXRFrame(time, frame) {
    const pose = frame.getViewerPose(referenceSpace);
    if (pose) {
      // 渲染每个视图
      for (const view of pose.views) {
        renderView(view);
      }
    }
    
    session.requestAnimationFrame(onXRFrame);
  }
}

十、重力与运动传感器API

多传感器融合

javascript 复制代码
// 加速度计
const accelerometer = new Accelerometer({ frequency: 60 });
accelerometer.addEventListener('reading', () => {
  console.log('加速度:', accelerometer.x, accelerometer.y, accelerometer.z);
});

// 陀螺仪
const gyroscope = new Gyroscope({ frequency: 60 });
gyroscope.addEventListener('reading', () => {
  console.log('角速度:', gyroscope.x, gyroscope.y, gyroscope.z);
});

// 磁力计
const magnetometer = new Magnetometer({ frequency: 10 });

兼容性总结:

  • ✅ Chrome 67+ (需要HTTPS)
  • ✅ Edge 79+
  • ✅ Firefox (部分支持)
  • ✅ Safari (iOS 13+)

十一、环境光传感器API

环境光检测

javascript 复制代码
const sensor = new AmbientLightSensor();
sensor.addEventListener('reading', () => {
  console.log('环境光照度:', sensor.illuminance, 'lux');
  
  // 自动调整界面亮度
  document.body.style.filter = `brightness(${sensor.illuminance / 100})`;
});
sensor.start();

兼容性:

  • ✅ Chrome 66+
  • ✅ Edge 79+
  • ❌ Firefox (未支持)
  • ❌ Safari (未支持)

十二、地理位置API(高级)

精确定位和地理围栏

javascript 复制代码
// 高精度定位
navigator.geolocation.watchPosition(
  position => {
    console.log('纬度:', position.coords.latitude);
    console.log('经度:', position.coords.longitude);
    console.log('海拔:', position.coords.altitude);
    console.log('精度:', position.coords.accuracy, '米');
  },
  error => console.error(error),
  {
    enableHighAccuracy: true,
    timeout: 5000,
    maximumAge: 0
  }
);

// 地理围栏
const geofence = new Geofence({
  latitude: 39.9042,
  longitude: 116.4074,
  radius: 1000 // 1公里范围
});

十三、设备方向API

3D空间定位

javascript 复制代码
window.addEventListener('deviceorientation', event => {
  console.log('Alpha (绕Z轴):', event.alpha);
  console.log('Beta (绕X轴):', event.beta);
  console.log('Gamma (绕Y轴):', event.gamma);
  
  // 创建3D罗盘
  updateCompass(event.alpha);
});

// 设备运动事件
window.addEventListener('devicemotion', event => {
  console.log('加速度:', event.acceleration);
  console.log('含重力的加速度:', event.accelerationIncludingGravity);
  console.log('旋转速率:', event.rotationRate);
});

十四、电池状态API

电源管理

javascript 复制代码
navigator.getBattery().then(battery => {
  console.log('电量百分比:', battery.level * 100 + '%');
  console.log('充电中:', battery.charging);
  console.log('充满时间:', battery.chargingTime);
  console.log('耗尽时间:', battery.dischargingTime);

  // 监听电量变化
  battery.addEventListener('levelchange', () => {
    adjustPerformanceBasedOnBattery(battery.level);
  });
});

十五、网络信息API

网络状态监控

javascript 复制代码
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;

console.log('网络类型:', connection.type);
console.log('有效类型:', connection.effectiveType);
console.log('下行速度:', connection.downlink, 'Mbps');
console.log('往返时间:', connection.rtt, 'ms');
console.log('节省数据模式:', connection.saveData);

// 网络变化监听
connection.addEventListener('change', () => {
  adjustQualityBasedOnNetwork(connection.effectiveType);
});

十六、屏幕唤醒API

防止屏幕休眠

javascript 复制代码
// 请求屏幕唤醒锁
let wakeLock = null;

async function requestWakeLock() {
  try {
    wakeLock = await navigator.wakeLock.request('screen');
    console.log('屏幕唤醒锁已获取');
    
    wakeLock.addEventListener('release', () => {
      console.log('屏幕唤醒锁已释放');
    });
  } catch (err) {
    console.error('无法获取屏幕唤醒锁:', err);
  }
}

// 释放唤醒锁
function releaseWakeLock() {
  if (wakeLock) {
    wakeLock.release();
    wakeLock = null;
  }
}

十七、振动API

触觉反馈

javascript 复制代码
// 简单振动
navigator.vibrate(200);

// 复杂振动模式
navigator.vibrate([100, 50, 100, 50, 100]);

// 游戏震动反馈
function gameVibration(pattern) {
  if ('vibrate' in navigator) {
    navigator.vibrate(pattern);
  }
}

// 停止振动
navigator.vibrate(0);

十八、剪贴板API

高级剪贴板操作

javascript 复制代码
// 读取剪贴板
async function readClipboard() {
  try {
    const text = await navigator.clipboard.readText();
    console.log('剪贴板文本:', text);
    
    // 读取图片等丰富内容
    const items = await navigator.clipboard.read();
    for (const item of items) {
      for (const type of item.types) {
        const blob = await item.getType(type);
        console.log('剪贴板内容类型:', type);
      }
    }
  } catch (err) {
    console.error('无法读取剪贴板:', err);
  }
}

// 写入剪贴板
async function writeToClipboard(content) {
  try {
    await navigator.clipboard.writeText(content);
    
    // 写入丰富内容
    const blob = new Blob(['Hello World'], { type: 'text/plain' });
    const data = new ClipboardItem({ 'text/plain': blob });
    await navigator.clipboard.write([data]);
  } catch (err) {
    console.error('无法写入剪贴板:', err);
  }
}

十九、支付请求API

原生支付体验

javascript 复制代码
const paymentRequest = new PaymentRequest(
  [
    {
      supportedMethods: 'https://example.com/pay',
      data: {
        merchantId: '123456'
      }
    }
  ],
  {
    total: {
      label: '总价',
      amount: { currency: 'CNY', value: '99.99' }
    }
  }
);

// 显示支付界面
paymentRequest.show()
  .then(paymentResponse => {
    console.log('支付成功:', paymentResponse);
    return paymentResponse.complete('success');
  })
  .catch(error => {
    console.error('支付失败:', error);
  });

二十、凭证管理API

密码和凭证管理

javascript 复制代码
// 保存凭证
navigator.credentials.create({
  password: {
    id: 'user123',
    password: 'securepassword',
    name: '张三',
    iconURL: 'https://example.com/avatar.png'
  }
}).then(credential => {
  console.log('凭证已保存');
});

// 获取凭证
navigator.credentials.get({
  password: true,
  mediation: 'required'
}).then(credential => {
  if (credential) {
    console.log('自动填充凭证:', credential.id);
  }
});

二十一、后台同步API

离线任务处理

javascript 复制代码
// 注册后台同步
navigator.serviceWorker.ready.then(registration => {
  return registration.sync.register('my-background-sync');
});

// Service Worker中处理同步
self.addEventListener('sync', event => {
  if (event.tag === 'my-background-sync') {
    event.waitUntil(doBackgroundWork());
  }
});

async function doBackgroundWork() {
  // 执行后台任务,如数据同步、通知等
  const messages = await getPendingMessages();
  await sendMessagesToServer(messages);
}

二十二、定期后台同步API

定时后台任务

javascript 复制代码
// 注册定期同步
navigator.serviceWorker.ready.then(registration => {
  registration.periodicSync.register('daily-sync', {
    minInterval: 24 * 60 * 60 * 1000 // 24小时
  }).then(() => {
    console.log('定期同步已注册');
  });
});

// 监听定期同步事件
self.addEventListener('periodicsync', event => {
  if (event.tag === 'daily-sync') {
    event.waitUntil(doDailySync());
  }
});

二十三、联系人选择API

安全访问通讯录

javascript 复制代码
const props = ['name', 'email', 'tel', 'address', 'icon'];
const opts = { multiple: true };

try {
  const contacts = await navigator.contacts.select(props, opts);
  console.log('选择的联系人:', contacts);
} catch (err) {
  console.error('访问联系人失败:', err);
}

二十四、文件系统访问API

原生文件操作

javascript 复制代码
// 打开文件
const fileHandle = await window.showOpenFilePicker({
  types: [
    {
      description: '文本文件',
      accept: {'text/plain': ['.txt']}
    }
  ]
});

// 读取文件
const file = await fileHandle[0].getFile();
const contents = await file.text();

// 保存文件
const writable = await fileHandle.createWritable();
await writable.write(contents);
await writable.close();

二十五、形状检测API

AI图像识别

javascript 复制代码
// 人脸检测
const faceDetector = new FaceDetector();
const faces = await faceDetector.detect(imageElement);
console.log('检测到人脸数:', faces.length);

// 条码检测
const barcodeDetector = new BarcodeDetector();
const barcodes = await barcodeDetector.detect(imageElement);
console.log('检测到的条码:', barcodes);

// 文本检测
const textDetector = new TextDetector();
const texts = await textDetector.detect(imageElement);
console.log('识别到的文本:', texts);

二十六、WebTransport API

下一代网络传输

javascript 复制代码
const transport = new WebTransport('https://example.com:4999/');
await transport.ready;

// 创建双向流
const stream = await transport.createBidirectionalStream();
const reader = stream.readable.getReader();
const writer = stream.writable.getWriter();

// 发送数据
await writer.write(new Uint8Array([1, 2, 3]));

// 接收数据
const { value, done } = await reader.read();

二十七、压缩流API

高效数据压缩

javascript 复制代码
// 压缩数据
const readableStream = new Blob(['Hello World']).stream();
const compressedStream = readableStream.pipeThrough(new CompressionStream('gzip'));

// 解压缩
const decompressedStream = compressedStream.pipeThrough(new DecompressionStream('gzip'));

// 使用压缩流
const response = await fetch('https://example.com/data');
const decompressed = response.body.pipeThrough(new DecompressionStream('gzip'));

二十八、WebCodecs API

底层音视频编解码

javascript 复制代码
// 视频编码器
const encoder = new VideoEncoder({
  output: chunk => {
    console.log('编码后的视频块:', chunk);
  },
  error: e => console.error(e)
});

encoder.configure({
  codec: 'vp8',
  width: 640,
  height: 480,
  bitrate: 1000000
});

// 音频编码器
const audioEncoder = new AudioEncoder({
  output: chunk => {
    console.log('编码后的音频块:', chunk);
  }
});

二十九、WebGL 2.0/3.0

高级图形渲染

javascript 复制代码
// WebGL 2.0
const gl = canvas.getContext('webgl2');
if (gl) {
  // 使用计算着色器、实例化渲染等高级特性
  gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, 100);
}

// WebGPU风格的现代API
const context = canvas.getContext('webgpu');
await context.configure({
  device: await navigator.gpu.requestAdapter(),
  format: 'bgra8unorm'
});

三十、量子计算API(实验性)

量子算法模拟

javascript 复制代码
// 创建量子电路
const quantumCircuit = new QuantumCircuit(2);

// 添加量子门
quantumCircuit.h(0); // Hadamard门
quantumCircuit.cx(0, 1); // CNOT门

// 执行量子计算
const result = quantumCircuit.execute();
console.log('量子计算结果:', result.measureAll());

兼容性终极指南

1. 分级支持策略

javascript 复制代码
function getAPISupportLevel() {
  return {
    // 广泛支持 (80%+ 浏览器)
    widelySupported: [
      'Geolocation API', 'Vibration API', 'Clipboard API',
      'Web Storage', 'Service Workers', 'WebGL'
    ],
    
    // 中等支持 (50-80% 浏览器)
    moderatelySupported: [
      'Web Bluetooth', 'WebUSB', 'Web Serial', 'WebHID',
      'Sensors API', 'WebXR', 'File System Access'
    ],
    
    // 有限支持 (<50% 浏览器)
    limitedSupport: [
      'WebNN', 'WebGPU', 'WebTransport', 'WebCodecs',
      'Shape Detection', 'Contact Picker', 'Quantum API'
    ]
  };
}

2. 特性检测最佳实践

javascript 复制代码
// 综合特性检测
async function checkFeatureSupport() {
  const features = {
        // 硬件访问类
        webusb: 'usb' in navigator,
        webbluetooth: 'bluetooth' in navigator,
        webserial: 'serial' in navigator,
        webhid: 'hid' in navigator,
        webgpu: 'gpu' in navigator,
        webnn: 'ml' in navigator,
        webxr: 'xr' in navigator,
        sensors: 'Accelerometer' in window,
        vibration: 'vibrate' in navigator,

        // 系统功能类
        clipboard: 'clipboard' in navigator && 'writeText' in navigator.clipboard,
        payments: 'PaymentRequest' in window,
        credentials: 'credentials' in navigator,
        backgroundSync: 'serviceWorker' in navigator && 'sync' in ServiceWorkerRegistration.prototype,
        contactPicker: 'contacts' in navigator && 'select' in navigator.contacts,
        fileSystem: 'showOpenFilePicker' in window,
        shapeDetection: 'FaceDetector' in window,
        webtransport: 'WebTransport' in window,
        compression: 'CompressionStream' in window,
        webcodecs: 'VideoEncoder' in window,

        // 媒体类
        mediaRecorder: 'MediaRecorder' in window,
        mediaSession: 'mediaSession' in navigator,
        pictureInPicture: 'pictureInPictureEnabled' in document,
        webSpeech: 'speechSynthesis' in window && 'SpeechRecognition' in window,

        // 网络类
        webRTC: 'RTCPeerConnection' in window,
        webSocket: 'WebSocket' in window,
        beacon: 'sendBeacon' in navigator,

        // 存储类
        indexedDB: 'indexedDB' in window,
        cacheStorage: 'caches' in window,
        storageQuota: 'storage' in navigator && 'estimate' in navigator.storage,

        // 设备能力类
        geolocation: 'geolocation' in navigator,
        batteryStatus: 'getBattery' in navigator,
        deviceOrientation: 'DeviceOrientationEvent' in window,
        deviceMemory: 'deviceMemory' in navigator,
        hardwareConcurrency: 'hardwareConcurrency' in navigator,

        // UI/UX类
        fullscreen: 'requestFullscreen' in Element.prototype,
        pointerLock: 'requestPointerLock' in Element.prototype,
        wakeLock: 'wakeLock' in navigator,

        // 安全类
        credentialManagement: 'CredentialsContainer' in window,
        webAuthn: 'PublicKeyCredential' in window,

        // 其他
        webShare: 'share' in navigator,
        webLocks: 'locks' in navigator,
        broadcastChannel: 'BroadcastChannel' in window,
        performance: 'performance' in window && 'measure' in performance,
        reporting: 'ReportingObserver' in window
  };

  return features;
}

3. 多层级降级方案

javascript 复制代码
class HardwareAPIManager {
  constructor() {
    this.supportedAPIs = {};
    this.fallbackStrategies = new Map();
  }

  async initialize() {
    this.supportedAPIs = await checkFeatureSupport();
    this.setupFallbacks();
  }

  setupFallbacks() {
    // WebUSB降级方案
    this.fallbackStrategies.set('webusb', {
      description: '使用WebSocket+后端代理',
      implementation: async (deviceId) => {
        // 通过WebSocket与后端服务通信
        const socket = new WebSocket('wss://api.example.com/usb-proxy');
        return new USBProxy(socket, deviceId);
      }
    });

    // WebBluetooth降级
    this.fallbackStrategies.set('webbluetooth', {
      description: '使用WebSocket+蓝牙网关',
      implementation: async (deviceId) => {
        // 通过网关设备中转
        return new BluetoothGateway(deviceId);
      }
    });
  }

  async useAPI(apiName, ...args) {
    if (this.supportedAPIs[apiName]) {
      // 使用原生API
      return this[`use${apiName.charAt(0).toUpperCase() + apiName.slice(1)}`](...args);
    } else if (this.fallbackStrategies.has(apiName)) {
      // 使用降级方案
      const fallback = this.fallbackStrategies.get(apiName);
      console.warn(`使用降级方案: ${fallback.description}`);
      return fallback.implementation(...args);
    } else {
      throw new Error(`API ${apiName} 不支持且无降级方案`);
    }
  }
}

未来展望:浏览器作为操作系统

这些硬件API的快速发展表明,浏览器正在演变成一个完整的应用程序平台。从调用物理设备到运行AI模型,从处理支付到管理文件系统,现代浏览器已经具备了操作系统的许多特征。

关键趋势:

  1. 边缘计算 - 浏览器内AI推理减少云端依赖
  2. 离线优先 - Service Worker和缓存API支持完全离线应用
  3. 硬件抽象 - 统一的API接口屏蔽硬件差异
  4. 安全沙盒 - 在安全环境中提供强大的硬件访问能力

结语:谨慎而大胆地前进

浏览器硬件API为我们打开了无限可能,但也带来了新的挑战。作为开发者,我们应该:

  1. 始终优先考虑用户体验 - 即使技术很酷,也要确保对用户真正有用
  2. 渐进增强 - 为不支持新API的浏览器提供可用的替代方案
  3. 关注性能 - 硬件API可能消耗大量资源,需要精细优化
  4. 重视安全 - 严格遵循权限模型和安全最佳实践

现在就开始实验这些API吧! 但记住:伟大的力量伴随着伟大的责任。在追求技术创新的同时,永远不要忘记用户体验和安全性的重要性。

浏览器正在重新定义什么是可能的,而你就是这场革命的一部分。选择合适的API,构建令人惊叹的应用,但始终为用户提供平滑优雅的体验。

相关推荐
即兴小索奇3 小时前
Google AI Mode 颠覆传统搜索方式,它是有很大可能的
前端·后端·架构
大虾写代码3 小时前
nvm和nrm的详细安装配置,从卸载nodejs到安装NVM管理nodejs版本,以及安装nrm管理npm版本
前端·npm·node.js·nvm·nrm
星哥说事3 小时前
下一代开源 RAG 引擎,让你的 AI 检索与推理能力直接起飞
前端
....4923 小时前
Vue3 与 AntV X6 节点传参、自动布局及边颜色控制教程
前端·javascript·vue.js
machinecat4 小时前
Webpack模块联邦 - vue项目嵌套react项目部分功能实践
前端·webpack
Ares-Wang4 小时前
Vue2 VS Vue3
javascript
今禾4 小时前
深入浅出:ES6 Modules 与 CommonJS 的爱恨情仇
前端·javascript·面试
前端小白19954 小时前
面试取经:Vue篇-Vue2响应式原理
前端·vue.js·面试
子兮曰4 小时前
⭐告别any类型!TypeScript从零到精通的20个实战技巧,让你的代码质量提升300%
前端·javascript·typescript