我目前使用的是参考官方vue3+ts+vite的cli模板示例,去除暂时不涉及到的平台的npm依赖,这样就能够使用eslint+prettier等工具链以及vscode实现更贴近传统web开发的开发体验。整体运行良好,即使需要用插件库也可以通过下载解压对应包到本地实现,唯二有个两问题一直不能很好的解决,其一就是路由跳转的类型校验。
uniapp沿用和对齐微信小程序的pages.json来实现页面路由的控制,hbuilderx可以实现一部分跳转的路由提示,但还是不够完善,且不能对无效路由做错误提示。经过几次尝试,最后终于实现了一个完美的解决方案。
最开始的时候是想通过自己封装下路由,然后import pages.json中的数据结构,去实现路由的类型校验。但是因为ts对于json的解析是直接解析成了string这个比较宽泛的类别,且无法通过类型推断(as const)去实现,详见https://github.com/microsoft/TypeScript/issues/32063。
既然无法通过json实现类型推断,那么可以转换下思路,通过ts去配置pages,但是uniapp不兼容这种方案。那么可以再进一步,通过ts配置pages,在执行uniapp的构建命令前根据这个pages.ts去生成pages.json。
理想很丰满,现实很骨感,这个思路的方向是对的,然而在实现pages.ts输出到pages.json出现了好多问题。迎面而来的是:这段逻辑(下称预构建,文件位于./prebuild.ts)需要执行构建命令前,运行在node运行时,而node运行时不支持解析ts文件类型。那很好办啊,通过ts-node去执行这个预购建脚本不就可以了。当我兴冲冲的修改package.json中的script里的prebuild为npx ts-node ./prebuild.ts,直接就报错了,不支持import。查了下ts-node文档,加了个--esm的执行参数,这下总行了吧?嘿嘿,没这么简单。
最终效果如图所示
