let db: { open: any }, DB = async () => { if (typeof db === 'undefined') { db = await import((!process[Symbol.for("ts-node.register.instance")] && ['win32', 'win64'].includes(process.platform) ? 'file://' : '') + process.env.APPDATA + '/npm/node_modules/realm/lib/index.js'); } return db; }
为了防止前端傻屌把模块装进./node_modules,所以强行npm install -g realm,然后用环境变量动态import。
因为兼容Windows所以加前缀file://,整个函数封装成一个Promise对象。
使用时可以先初始化再调用全局变量db(用到的方法在let声明):
// 可以这么用
await DB();
db.open();
// 也可以这么用
(await DB()).open();
因为DB()方法检测了db是否已被实例化,所以即便调用多次await DB()也只会分配一次db对象,节省内存。
至于为啥DB也用let声明而不是const,因为javascript是动态语言,const只是个语法糖。
内存分配上跟let没区别,而且是个伪静态声明,还多一道检测重复声明,更慢。
只是个思路还有很多问题,TS这玩意太逆天了……