模块模式通过闭包实现私有插件,IIFE构建单例沙箱,工厂函数支持多实例隔离,公有方法守封装边界,驱动契约适配跨环境。

模块模式靠闭包实现私有插件,核心不是加个下划线或写个注释,而是让变量真正在作用域里“锁住”——没被 return 出去,外部就碰不到、改不了、也遍历不出来。
用 IIFE 构建单例插件沙箱
IIFE 是最稳的起点,适合全局唯一、轻量级的插件场景,比如统一日志上报、设备校准器、表单规则引擎。
- 把所有状态(如 _token、_cache)、工具函数(如 _validate()、_normalize())全写在匿名函数内部
- 只通过 return 暴露明确的方法,例如 init()、submit()、destroy()
- 初始化逻辑(如预加载字典、绑定事件、设置默认单位)放在 IIFE 开头,只执行一次
- 外部调用 plugin._cache 或遍历 plugin 对象,结果都是 undefined 或空
用工厂函数支持多实例隔离
当插件要服务多个租户、不同表单、AB 测试分支或独立硬件通道时,IIFE 会共享状态,必须改用工厂函数。
- 把插件逻辑封装成函数,接收配置参数(如 tenantId、unit、timeout)
- 每次调用都生成全新闭包,各实例的私有变量(如 _lastValue、_retryCount)完全不交叉
- 返回对象中的方法仍能访问所属闭包的数据,但无法越界读取其他实例内容
- 避免把私有数据直接挂到返回对象上(如 { _data: privateData }),那是快照,不是引用
暴露接口时守住封装边界
公有方法是唯一入口,所有敏感操作和校验必须收在内部,不能留后门。
- 入参必须校验:类型、范围、格式,统一交由私有函数(如 _sanitizeInput())处理
- 异步中间态(如 loading、error)藏在闭包里,只通过 getState() 或回调通知
- 提供 destroy() 方法,清理定时器、事件监听、连接句柄等持有的闭包引用
- 绝不暴露原始数据引用、构造函数、或调试用的 getRawState() 类接口
跨环境靠驱动契约,不靠平台 API
插件本身不关心运行在哪,只约定“怎么交能力、怎么调接口”。
- 不直接写 navigator.bluetooth 或 require('serialport'),而是定义 setDriver({ connect, read, disconnect })
- 宿主环境按需注入:Web 端用 WebUSB,uni-app 用蓝牙插件,Node.js 用串口库
- 整个模块只用标准 ES5+ 语法,IIFE 兼容浏览器、小程序、Node.js、uni-app JS 引擎
- 打包时加一层 module.exports = 插件名 或 export default,适配不同引入方式

















