HiHuo
首页
博客
手册
工具
首页
博客
手册
工具
  • Vue & CSS 进阶

    • 第0章:工具链与开发体验
    • 第1章:TypeScript 核心
    • 第2章:CSS 现代能力
    • 第3章:Vue3 核心与原理
    • 第4章:路由与状态管理
    • 第5章:工程化与性能
    • 第6章:测试与质量
    • 第7章:CSS 进阶专题
    • 第8章:项目实战A - SaaS仪表盘
    • 第9章:项目实战B - 内容社区
    • 第10章:Vue 内核深入
    • 第11章:微前端与部署
    • CSS 变量体系与主题系统深度指南
    • 前端安全与防护专题
    • CSS 专题:动效优化与微交互
    • CSS 专题:图片与图形处理
    • 实时通信与WebSocket专题
    • 开发工具与调试技巧专题
    • 新兴技术与未来趋势专题
    • 移动端开发与PWA专题
    • 附录A:代码片段库
    • 附录B:练习题集

新兴技术与未来趋势专题

探索前端技术前沿,掌握未来发展趋势

📚 专题目标

通过本专题学习,你将掌握:

  • WebAssembly 高性能计算
  • Web Components 原生组件开发
  • Web Streams 流式数据处理
  • 现代 Web APIs 应用
  • 前端技术发展趋势

⚡ WebAssembly 高性能计算

WebAssembly 基础应用

// wasm-loader.ts
export class WASMLoader {
  private static instance: WASMLoader
  private modules: Map<string, WebAssembly.Module> = new Map()
  private instances: Map<string, WebAssembly.Instance> = new Map()

  static getInstance(): WASMLoader {
    if (!WASMLoader.instance) {
      WASMLoader.instance = new WASMLoader()
    }
    return WASMLoader.instance
  }

  // 加载 WASM 模块
  async loadModule(name: string, wasmPath: string): Promise<WebAssembly.Instance> {
    if (this.instances.has(name)) {
      return this.instances.get(name)!
    }

    try {
      // 加载 WASM 文件
      const wasmResponse = await fetch(wasmPath)
      const wasmBytes = await wasmResponse.arrayBuffer()
      
      // 编译模块
      const module = await WebAssembly.compile(wasmBytes)
      this.modules.set(name, module)
      
      // 实例化模块
      const instance = await WebAssembly.instantiate(module, {
        env: {
          memory: new WebAssembly.Memory({ initial: 256 }),
          console_log: (ptr: number, len: number) => {
            const bytes = new Uint8Array(this.getMemory().buffer, ptr, len)
            const str = new TextDecoder().decode(bytes)
            console.log(str)
          }
        }
      })
      
      this.instances.set(name, instance)
      return instance
      
    } catch (error) {
      console.error(`Failed to load WASM module ${name}:`, error)
      throw error
    }
  }

  // 获取内存
  getMemory(): WebAssembly.Memory {
    const instance = Array.from(this.instances.values())[0]
    return instance?.exports.memory as WebAssembly.Memory
  }

  // 调用 WASM 函数
  callFunction(moduleName: string, functionName: string, ...args: any[]): any {
    const instance = this.instances.get(moduleName)
    if (!instance) {
      throw new Error(`Module ${moduleName} not loaded`)
    }

    const func = instance.exports[functionName] as Function
    if (!func) {
      throw new Error(`Function ${functionName} not found in module ${moduleName}`)
    }

    return func(...args)
  }
}

// 使用示例
const wasmLoader = WASMLoader.getInstance()

// 加载数学计算模块
const mathModule = await wasmLoader.loadModule('math', '/wasm/math.wasm')

// 调用 WASM 函数
const result = wasmLoader.callFunction('math', 'add', 5, 3)
console.log('WASM result:', result)

图像处理 WASM 应用

// image-processor.ts
export class ImageProcessor {
  private wasmLoader: WASMLoader
  private memory: WebAssembly.Memory | null = null

  constructor() {
    this.wasmLoader = WASMLoader.getInstance()
  }

  async initialize() {
    const instance = await this.wasmLoader.loadModule('image', '/wasm/image.wasm')
    this.memory = instance.exports.memory as WebAssembly.Memory
  }

  // 图像滤镜处理
  async applyFilter(imageData: ImageData, filterType: string): Promise<ImageData> {
    if (!this.memory) {
      throw new Error('WASM module not initialized')
    }

    const { width, height, data } = imageData
    const dataSize = width * height * 4

    // 分配内存
    const ptr = this.wasmLoader.callFunction('image', 'allocate', dataSize)
    
    // 复制图像数据到 WASM 内存
    const wasmMemory = new Uint8Array(this.memory.buffer, ptr, dataSize)
    wasmMemory.set(data)

    // 应用滤镜
    this.wasmLoader.callFunction('image', 'apply_filter', ptr, width, height, filterType)

    // 获取处理后的数据
    const processedData = new Uint8Array(wasmMemory)

    // 释放内存
    this.wasmLoader.callFunction('image', 'deallocate', ptr)

    return new ImageData(processedData, width, height)
  }

  // 图像缩放
  async resizeImage(imageData: ImageData, newWidth: number, newHeight: number): Promise<ImageData> {
    if (!this.memory) {
      throw new Error('WASM module not initialized')
    }

    const { width, height, data } = imageData
    const inputSize = width * height * 4
    const outputSize = newWidth * newHeight * 4

    // 分配输入和输出内存
    const inputPtr = this.wasmLoader.callFunction('image', 'allocate', inputSize)
    const outputPtr = this.wasmLoader.callFunction('image', 'allocate', outputSize)

    // 复制输入数据
    const inputMemory = new Uint8Array(this.memory.buffer, inputPtr, inputSize)
    inputMemory.set(data)

    // 执行缩放
    this.wasmLoader.callFunction('image', 'resize', inputPtr, width, height, outputPtr, newWidth, newHeight)

    // 获取输出数据
    const outputMemory = new Uint8Array(this.memory.buffer, outputPtr, outputSize)
    const outputData = new Uint8Array(outputMemory)

    // 释放内存
    this.wasmLoader.callFunction('image', 'deallocate', inputPtr)
    this.wasmLoader.callFunction('image', 'deallocate', outputPtr)

    return new ImageData(outputData, newWidth, newHeight)
  }
}

// 在 Vue 组件中使用
export default defineComponent({
  setup() {
    const imageProcessor = new ImageProcessor()
    const originalImage = ref<ImageData | null>(null)
    const processedImage = ref<ImageData | null>(null)
    const isProcessing = ref(false)

    onMounted(async () => {
      await imageProcessor.initialize()
    })

    const processImage = async (filterType: string) => {
      if (!originalImage.value) return

      isProcessing.value = true
      try {
        const result = await imageProcessor.applyFilter(originalImage.value, filterType)
        processedImage.value = result
      } catch (error) {
        console.error('Image processing failed:', error)
      } finally {
        isProcessing.value = false
      }
    }

    return {
      originalImage,
      processedImage,
      isProcessing,
      processImage
    }
  }
})

🧩 Web Components 原生组件开发

自定义元素开发

// custom-element.ts
export class CustomElement extends HTMLElement {
  private shadowRoot: ShadowRoot
  private props: Map<string, any> = new Map()
  private observers: Map<string, MutationObserver> = new Map()

  constructor() {
    super()
    this.shadowRoot = this.attachShadow({ mode: 'open' })
    this.setupProps()
    this.setupObservers()
  }

  // 设置属性
  private setupProps() {
    const props = this.getAttributeNames()
    props.forEach(prop => {
      this.props.set(prop, this.getAttribute(prop))
    })
  }

  // 设置观察者
  private setupObservers() {
    // 观察属性变化
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        if (mutation.type === 'attributes') {
          const attributeName = mutation.attributeName
          if (attributeName) {
            this.props.set(attributeName, this.getAttribute(attributeName))
            this.onAttributeChange(attributeName, this.getAttribute(attributeName))
          }
        }
      })
    })

    observer.observe(this, { attributes: true })
    this.observers.set('attributes', observer)
  }

  // 属性变化回调
  protected onAttributeChange(name: string, value: string | null) {
    // 子类可以重写此方法
  }

  // 渲染方法
  protected render() {
    // 子类需要实现此方法
  }

  // 连接回调
  connectedCallback() {
    this.render()
  }

  // 断开连接回调
  disconnectedCallback() {
    // 清理观察者
    this.observers.forEach(observer => observer.disconnect())
    this.observers.clear()
  }

  // 获取属性值
  protected getProp(name: string): any {
    return this.props.get(name)
  }

  // 设置属性值
  protected setProp(name: string, value: any) {
    this.props.set(name, value)
    this.setAttribute(name, value)
  }
}

// 计数器组件
export class CounterElement extends CustomElement {
  private count = 0

  protected render() {
    this.shadowRoot.innerHTML = `
      <style>
        :host {
          display: inline-block;
          padding: 16px;
          border: 1px solid #ccc;
          border-radius: 8px;
          font-family: Arial, sans-serif;
        }
        
        .counter {
          display: flex;
          align-items: center;
          gap: 12px;
        }
        
        .count {
          font-size: 24px;
          font-weight: bold;
          min-width: 40px;
          text-align: center;
        }
        
        button {
          padding: 8px 16px;
          border: none;
          border-radius: 4px;
          background: #007bff;
          color: white;
          cursor: pointer;
          font-size: 16px;
        }
        
        button:hover {
          background: #0056b3;
        }
        
        button:disabled {
          background: #ccc;
          cursor: not-allowed;
        }
      </style>
      
      <div class="counter">
        <button id="decrement">-</button>
        <span class="count" id="count">${this.count}</span>
        <button id="increment">+</button>
      </div>
    `

    // 绑定事件
    this.shadowRoot.getElementById('increment')?.addEventListener('click', () => {
      this.increment()
    })

    this.shadowRoot.getElementById('decrement')?.addEventListener('click', () => {
      this.decrement()
    })
  }

  private increment() {
    this.count++
    this.updateCount()
    this.dispatchEvent(new CustomEvent('count-change', { 
      detail: { count: this.count } 
    }))
  }

  private decrement() {
    this.count--
    this.updateCount()
    this.dispatchEvent(new CustomEvent('count-change', { 
      detail: { count: this.count } 
    }))
  }

  private updateCount() {
    const countElement = this.shadowRoot.getElementById('count')
    if (countElement) {
      countElement.textContent = this.count.toString()
    }
  }

  protected onAttributeChange(name: string, value: string | null) {
    if (name === 'initial-count' && value) {
      this.count = parseInt(value, 10) || 0
      this.updateCount()
    }
  }
}

// 注册自定义元素
customElements.define('counter-element', CounterElement)

组件通信系统

// component-communication.ts
export class ComponentCommunication {
  private static instance: ComponentCommunication
  private channels: Map<string, Set<CustomElement>> = new Map()
  private eventBus: EventTarget = new EventTarget()

  static getInstance(): ComponentCommunication {
    if (!ComponentCommunication.instance) {
      ComponentCommunication.instance = new ComponentCommunication()
    }
    return ComponentCommunication.instance
  }

  // 订阅频道
  subscribe(channel: string, element: CustomElement) {
    if (!this.channels.has(channel)) {
      this.channels.set(channel, new Set())
    }
    this.channels.get(channel)!.add(element)
  }

  // 取消订阅
  unsubscribe(channel: string, element: CustomElement) {
    const subscribers = this.channels.get(channel)
    if (subscribers) {
      subscribers.delete(element)
      if (subscribers.size === 0) {
        this.channels.delete(channel)
      }
    }
  }

  // 发布消息
  publish(channel: string, message: any) {
    const subscribers = this.channels.get(channel)
    if (subscribers) {
      subscribers.forEach(element => {
        element.dispatchEvent(new CustomEvent('channel-message', {
          detail: { channel, message }
        }))
      })
    }
  }

  // 全局事件总线
  emit(event: string, data: any) {
    this.eventBus.dispatchEvent(new CustomEvent(event, { detail: data }))
  }

  on(event: string, callback: (data: any) => void) {
    this.eventBus.addEventListener(event, (e: any) => callback(e.detail))
  }

  off(event: string, callback: (data: any) => void) {
    this.eventBus.removeEventListener(event, callback)
  }
}

// 使用示例
const comm = ComponentCommunication.getInstance()

// 在组件中订阅
export class ChatElement extends CustomElement {
  connectedCallback() {
    super.connectedCallback()
    comm.subscribe('chat', this)
    this.addEventListener('channel-message', this.handleMessage.bind(this))
  }

  disconnectedCallback() {
    super.disconnectedCallback()
    comm.unsubscribe('chat', this)
  }

  private handleMessage(event: CustomEvent) {
    const { channel, message } = event.detail
    if (channel === 'chat') {
      this.addMessage(message)
    }
  }

  private addMessage(message: any) {
    // 添加消息到聊天界面
  }
}

🌊 Web Streams 流式数据处理

流式数据处理

// stream-processor.ts
export class StreamProcessor {
  private static instance: StreamProcessor
  private streams: Map<string, ReadableStream> = new Map()

  static getInstance(): StreamProcessor {
    if (!StreamProcessor.instance) {
      StreamProcessor.instance = new StreamProcessor()
    }
    return StreamProcessor.instance
  }

  // 创建数据流
  createDataStream(name: string, data: any[]): ReadableStream {
    const stream = new ReadableStream({
      start(controller) {
        data.forEach(item => {
          controller.enqueue(item)
        })
        controller.close()
      }
    })

    this.streams.set(name, stream)
    return stream
  }

  // 创建无限流
  createInfiniteStream(name: string, generator: () => any): ReadableStream {
    const stream = new ReadableStream({
      start(controller) {
        const interval = setInterval(() => {
          try {
            const data = generator()
            controller.enqueue(data)
          } catch (error) {
            controller.error(error)
            clearInterval(interval)
          }
        }, 1000)

        // 停止流
        return () => clearInterval(interval)
      }
    })

    this.streams.set(name, stream)
    return stream
  }

  // 流转换
  transformStream<T, U>(
    inputStream: ReadableStream<T>,
    transformer: (data: T) => U
  ): ReadableStream<U> {
    return inputStream.pipeThrough(new TransformStream({
      transform(chunk, controller) {
        try {
          const transformed = transformer(chunk)
          controller.enqueue(transformed)
        } catch (error) {
          controller.error(error)
        }
      }
    }))
  }

  // 流过滤
  filterStream<T>(
    inputStream: ReadableStream<T>,
    predicate: (data: T) => boolean
  ): ReadableStream<T> {
    return inputStream.pipeThrough(new TransformStream({
      transform(chunk, controller) {
        if (predicate(chunk)) {
          controller.enqueue(chunk)
        }
      }
    }))
  }

  // 流合并
  mergeStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T> {
    return new ReadableStream({
      start(controller) {
        const readers = streams.map(stream => stream.getReader())
        
        const readNext = async () => {
          try {
            const promises = readers.map(reader => reader.read())
            const results = await Promise.allSettled(promises)
            
            results.forEach((result, index) => {
              if (result.status === 'fulfilled' && !result.value.done) {
                controller.enqueue(result.value.value)
              }
            })
            
            // 检查是否所有流都结束
            const allDone = results.every(result => 
              result.status === 'fulfilled' && result.value.done
            )
            
            if (!allDone) {
              readNext()
            } else {
              controller.close()
            }
          } catch (error) {
            controller.error(error)
          }
        }
        
        readNext()
      }
    })
  }

  // 流消费
  async consumeStream<T>(
    stream: ReadableStream<T>,
    consumer: (data: T) => void
  ): Promise<void> {
    const reader = stream.getReader()
    
    try {
      while (true) {
        const { done, value } = await reader.read()
        if (done) break
        
        consumer(value)
      }
    } finally {
      reader.releaseLock()
    }
  }
}

// 使用示例
const processor = StreamProcessor.getInstance()

// 创建数据流
const dataStream = processor.createDataStream('numbers', [1, 2, 3, 4, 5])

// 转换流
const doubledStream = processor.transformStream(dataStream, (n: number) => n * 2)

// 过滤流
const evenStream = processor.filterStream(doubledStream, (n: number) => n % 2 === 0)

// 消费流
processor.consumeStream(evenStream, (n: number) => {
  console.log('Even doubled number:', n)
})

实时数据流处理

// realtime-stream.ts
export class RealtimeStreamProcessor {
  private static instance: RealtimeStreamProcessor
  private streams: Map<string, ReadableStream> = new Map()
  private controllers: Map<string, ReadableStreamDefaultController> = new Map()

  static getInstance(): RealtimeStreamProcessor {
    if (!RealtimeStreamProcessor.instance) {
      RealtimeStreamProcessor.instance = new RealtimeStreamProcessor()
    }
    return RealtimeStreamProcessor.instance
  }

  // 创建实时流
  createRealtimeStream(name: string): ReadableStream {
    const stream = new ReadableStream({
      start: (controller) => {
        this.controllers.set(name, controller)
      },
      cancel: () => {
        this.controllers.delete(name)
      }
    })

    this.streams.set(name, stream)
    return stream
  }

  // 推送数据到流
  pushToStream(name: string, data: any): void {
    const controller = this.controllers.get(name)
    if (controller) {
      controller.enqueue(data)
    }
  }

  // 关闭流
  closeStream(name: string): void {
    const controller = this.controllers.get(name)
    if (controller) {
      controller.close()
      this.controllers.delete(name)
      this.streams.delete(name)
    }
  }

  // 错误处理
  errorStream(name: string, error: Error): void {
    const controller = this.controllers.get(name)
    if (controller) {
      controller.error(error)
      this.controllers.delete(name)
      this.streams.delete(name)
    }
  }

  // 创建 WebSocket 流
  createWebSocketStream(url: string): ReadableStream {
    const stream = new ReadableStream({
      start: (controller) => {
        const ws = new WebSocket(url)
        
        ws.onmessage = (event) => {
          try {
            const data = JSON.parse(event.data)
            controller.enqueue(data)
          } catch (error) {
            controller.error(error)
          }
        }
        
        ws.onerror = (error) => {
          controller.error(error)
        }
        
        ws.onclose = () => {
          controller.close()
        }
      }
    })

    return stream
  }

  // 创建 Server-Sent Events 流
  createSSEStream(url: string): ReadableStream {
    const stream = new ReadableStream({
      start: (controller) => {
        const eventSource = new EventSource(url)
        
        eventSource.onmessage = (event) => {
          try {
            const data = JSON.parse(event.data)
            controller.enqueue(data)
          } catch (error) {
            controller.error(error)
          }
        }
        
        eventSource.onerror = (error) => {
          controller.error(error)
        }
      }
    })

    return stream
  }
}

// 在 Vue 组件中使用
export default defineComponent({
  setup() {
    const streamProcessor = RealtimeStreamProcessor.getInstance()
    const data = ref<any[]>([])
    const isConnected = ref(false)

    onMounted(() => {
      // 创建实时流
      const stream = streamProcessor.createRealtimeStream('realtime-data')
      
      // 消费流数据
      streamProcessor.consumeStream(stream, (item: any) => {
        data.value.push(item)
        
        // 限制数据量
        if (data.value.length > 100) {
          data.value.shift()
        }
      })

      // 模拟数据推送
      const interval = setInterval(() => {
        const newData = {
          id: Date.now(),
          value: Math.random() * 100,
          timestamp: new Date()
        }
        streamProcessor.pushToStream('realtime-data', newData)
      }, 1000)

      isConnected.value = true

      onUnmounted(() => {
        clearInterval(interval)
        streamProcessor.closeStream('realtime-data')
        isConnected.value = false
      })
    })

    return {
      data,
      isConnected
    }
  }
})

🚀 现代 Web APIs 应用

文件系统访问 API

// file-system.ts
export class FileSystemManager {
  private static instance: FileSystemManager
  private fileHandles: Map<string, FileSystemFileHandle> = new Map()
  private directoryHandles: Map<string, FileSystemDirectoryHandle> = new Map()

  static getInstance(): FileSystemManager {
    if (!FileSystemManager.instance) {
      FileSystemManager.instance = new FileSystemManager()
    }
    return FileSystemManager.instance
  }

  // 检查 API 支持
  isSupported(): boolean {
    return 'showOpenFilePicker' in window && 'showSaveFilePicker' in window
  }

  // 打开文件
  async openFile(options: OpenFilePickerOptions = {}): Promise<File> {
    if (!this.isSupported()) {
      throw new Error('File System Access API not supported')
    }

    const [fileHandle] = await window.showOpenFilePicker(options)
    const file = await fileHandle.getFile()
    
    this.fileHandles.set(file.name, fileHandle)
    return file
  }

  // 保存文件
  async saveFile(content: string, options: SaveFilePickerOptions = {}): Promise<void> {
    if (!this.isSupported()) {
      throw new Error('File System Access API not supported')
    }

    const fileHandle = await window.showSaveFilePicker(options)
    const writable = await fileHandle.createWritable()
    await writable.write(content)
    await writable.close()
    
    this.fileHandles.set(fileHandle.name, fileHandle)
  }

  // 打开目录
  async openDirectory(): Promise<FileSystemDirectoryHandle> {
    if (!this.isSupported()) {
      throw new Error('File System Access API not supported')
    }

    const directoryHandle = await window.showDirectoryPicker()
    this.directoryHandles.set(directoryHandle.name, directoryHandle)
    return directoryHandle
  }

  // 读取目录内容
  async readDirectory(directoryHandle: FileSystemDirectoryHandle): Promise<FileSystemHandle[]> {
    const handles: FileSystemHandle[] = []
    
    for await (const handle of directoryHandle.values()) {
      handles.push(handle)
    }
    
    return handles
  }

  // 创建文件
  async createFile(
    directoryHandle: FileSystemDirectoryHandle,
    name: string,
    content: string
  ): Promise<void> {
    const fileHandle = await directoryHandle.getFileHandle(name, { create: true })
    const writable = await fileHandle.createWritable()
    await writable.write(content)
    await writable.close()
  }

  // 删除文件
  async deleteFile(
    directoryHandle: FileSystemDirectoryHandle,
    name: string
  ): Promise<void> {
    await directoryHandle.removeEntry(name)
  }

  // 获取文件内容
  async getFileContent(fileHandle: FileSystemFileHandle): Promise<string> {
    const file = await fileHandle.getFile()
    return file.text()
  }
}

// 使用示例
const fileManager = FileSystemManager.getInstance()

// 打开文件
const file = await fileManager.openFile({
  types: [{
    description: 'Text files',
    accept: { 'text/plain': ['.txt'] }
  }]
})

// 保存文件
await fileManager.saveFile('Hello, World!', {
  types: [{
    description: 'Text files',
    accept: { 'text/plain': ['.txt'] }
  }]
})

剪贴板 API

// clipboard-manager.ts
export class ClipboardManager {
  private static instance: ClipboardManager

  static getInstance(): ClipboardManager {
    if (!ClipboardManager.instance) {
      ClipboardManager.instance = new ClipboardManager()
    }
    return ClipboardManager.instance
  }

  // 检查 API 支持
  isSupported(): boolean {
    return 'clipboard' in navigator
  }

  // 读取文本
  async readText(): Promise<string> {
    if (!this.isSupported()) {
      throw new Error('Clipboard API not supported')
    }

    return navigator.clipboard.readText()
  }

  // 写入文本
  async writeText(text: string): Promise<void> {
    if (!this.isSupported()) {
      throw new Error('Clipboard API not supported')
    }

    await navigator.clipboard.writeText(text)
  }

  // 读取图片
  async readImage(): Promise<Blob> {
    if (!this.isSupported()) {
      throw new Error('Clipboard API not supported')
    }

    const clipboardItems = await navigator.clipboard.read()
    
    for (const clipboardItem of clipboardItems) {
      for (const type of clipboardItem.types) {
        if (type.startsWith('image/')) {
          const blob = await clipboardItem.getType(type)
          return blob
        }
      }
    }
    
    throw new Error('No image found in clipboard')
  }

  // 写入图片
  async writeImage(blob: Blob): Promise<void> {
    if (!this.isSupported()) {
      throw new Error('Clipboard API not supported')
    }

    const clipboardItem = new ClipboardItem({
      [blob.type]: blob
    })

    await navigator.clipboard.write([clipboardItem])
  }

  // 监听剪贴板变化
  onClipboardChange(callback: (event: ClipboardEvent) => void): void {
    document.addEventListener('paste', callback)
  }

  // 移除剪贴板监听
  offClipboardChange(callback: (event: ClipboardEvent) => void): void {
    document.removeEventListener('paste', callback)
  }
}

// 在 Vue 组件中使用
export default defineComponent({
  setup() {
    const clipboardManager = ClipboardManager.getInstance()
    const clipboardText = ref('')
    const clipboardImage = ref<string | null>(null)

    const copyText = async (text: string) => {
      try {
        await clipboardManager.writeText(text)
        console.log('Text copied to clipboard')
      } catch (error) {
        console.error('Failed to copy text:', error)
      }
    }

    const pasteText = async () => {
      try {
        const text = await clipboardManager.readText()
        clipboardText.value = text
      } catch (error) {
        console.error('Failed to paste text:', error)
      }
    }

    const pasteImage = async () => {
      try {
        const blob = await clipboardManager.readImage()
        const url = URL.createObjectURL(blob)
        clipboardImage.value = url
      } catch (error) {
        console.error('Failed to paste image:', error)
      }
    }

    return {
      clipboardText,
      clipboardImage,
      copyText,
      pasteText,
      pasteImage
    }
  }
})

🎯 专题总结

通过本专题学习,你掌握了:

  1. WebAssembly 应用:高性能计算、图像处理、内存管理
  2. Web Components 开发:自定义元素、组件通信、原生组件
  3. Web Streams 处理:流式数据、实时处理、流转换
  4. 现代 Web APIs:文件系统、剪贴板、设备访问
  5. 技术发展趋势:性能优化、用户体验、未来方向

📝 练习题

  1. 实现一个 WASM 图像处理应用
  2. 开发一个 Web Components 组件库
  3. 构建一个实时数据流处理系统
  4. 创建一个文件管理系统
  5. 实现剪贴板功能应用

🔗 相关资源

  • WebAssembly 文档
  • Web Components 规范
  • Web Streams API
  • 现代 Web APIs
  • 前端技术趋势
Prev
开发工具与调试技巧专题
Next
移动端开发与PWA专题