动态导入(import())可用于懒加载蓝牙扫描模块,需先检测 navigator.bluetooth 是否可用,再用 try/catch 加载并调用封装函数,且必须由用户交互触发,确保运行在 https/localhost 安全上下文。

JavaScript 中动态导入(import())可以用来按需加载蓝牙设备扫描模块,实现真正的懒加载,避免初始包体积过大或在不支持蓝牙的环境中报错。
动态导入蓝牙模块的正确写法
不能直接在顶层使用 import 声明引入 Web Bluetooth API 相关逻辑(如 navigator.bluetooth),因为它是浏览器原生 API,无需安装模块。但如果你封装了蓝牙扫描逻辑在独立模块(例如 bluetooth-scanner.js),可以用 import() 懒加载该模块:
- 确保模块导出的是函数或类,比如
scanDevices()或BluetoothScanner - 调用前检查
navigator.bluetooth是否可用,否则跳过导入或提示不支持 - 用
try/catch处理动态导入失败(如路径错误、CSP 限制、跨域问题)
示例:
async function startBluetoothScan() {
if (!navigator.bluetooth) {
console.warn('Web Bluetooth not supported');
return;
}
try {
const { scanDevices } = await import('./bluetooth-scanner.js');
await scanDevices();
} catch (err) {
console.error('Failed to load Bluetooth module:', err);
}
}
避免常见陷阱
Web Bluetooth 要求页面运行在安全上下文(HTTPS 或 localhost),且用户交互触发(如点击按钮)。动态导入本身不解决这些限制,但可配合它们使用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要在页面加载时自动触发
import()+requestDevice(),必须由用户手势(click、touchstart)驱动 - 动态导入后立即调用蓝牙 API,仍需处理
SecurityError或NotAllowedError - 模块内不应提前执行
navigator.bluetooth.requestDevice(),应暴露可调用函数,由外部控制时机
结合条件打包与功能检测
如果项目用构建工具(如 Vite、Webpack),可进一步优化:
- 将蓝牙相关代码单独拆包,通过
import()触发 chunk 加载 - 在
package.json中标记"browserslist"支持蓝牙的浏览器版本,避免为旧浏览器打包无用逻辑 - 用
typeof navigator.bluetooth !== 'undefined'做运行时特征检测,比 UA 判断更可靠
替代方案:仅封装 API 调用,不依赖外部模块
多数场景下,蓝牙扫描逻辑很轻量,无需单独模块。更简洁的做法是:不拆文件,只把扫描操作封装成函数,并在需要时调用,同时做环境检查:
async function scanNearbyDevices() {
if (!navigator.bluetooth) throw new Error('Bluetooth not available');
const device = await navigator.bluetooth.requestDevice({
acceptAllDevices: true,
optionalServices: ['battery_service']
});
return device;
}
这样既无额外模块依赖,又保持了按需执行和错误防御能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










