公司项目代码是用 TypeScript 写的, 中间遇到有些代码不要放到 Node 里面去跑.
具体场景一些路由配置, 比较大的一块 JSON 数据定义在 TypeScript 里.
我另外有增加脚本, 基于这些 JSON 数据用来生成切换路由的函数.
这就需要运行 TypeScript 了, 而且可能包含一些额外的业务代码.
首先 Node 运行 TypeScript 有提供 ts-node 用来处理.
ts-node 会先编译 TypeScript 代码到 JavaScript, 再调用 Node 运行.
不过这个办法有一些问题, 一个是 TypeScript 定义的路径配置不成功,
另一个问题更麻烦点, 就是引用到的其他的浏览器端代码因为触发运行而引起报错.
Webpack 打包 TypeScript Node 代码
我先想到了一个相对省事的方案, 就是用 Webpack 对 TypeScript 进行打包.
打包完成以后输出 JavaScript 代码. 而浏览器代码打包进去, 但不一定运行.
由于 TypeScript 配置在 Webpack 当中引用有比较成熟的方案, 整个配置也写好:
module.exports = {
mode: "development",
target: "node",
entry: ["./example/gen-router.ts"],
output: {
filename: "gen-router.js",
path: path.join(__dirname, "../", distFolder),
},
devtool: "none",
module: {
rules: [
// 正常的 TypeScript 编译方式, 我这份是拷贝的.
{
test: /\.tsx"scripts")],
use: [
{ loader: "cache-loader" },
{
loader: "thread-loader",
options: {
workers: require("os").cpus().length - 1,
},
},
{
loader: "ts-loader",
options: {
happyPackMode: true,
transpileOnly: true,
},
},
],
},
],
},
// Node 模块, 写在 external 里面表明不需要进行打包. 注意 commonjs 前缀
externals: {
prettier: "commonjs prettier",
"@jimengio/router-code-generator": "commonjs @jimengio/router-code-generator",
fs: "commonjs fs",
path: "commonjs path",
},
resolve: {
extensions: [".tsx", ".ts", ".js"],
modules: [path.join(__dirname, "example"), "node_modules"],
// 引用 Plugin 用于读取 tsconfig.json 文件的配置
plugins: [new TsconfigPathsPlugin({ configFile: path.join(__dirname, "../tsconfig.json") })],
},
};
基于这个配置打包以后, TypeScript 的代码被打包好, 并且引用响应的 Node 模块.
运行就满足需求了.
这个方式对于其他的服务端渲染的 TypeScript 代码打包也是类似的.
一些特殊的依赖如果不好处理, 可以放在 Webpack 当中进行打包和映射, 得到 js.
ts-node 运行
Webpack 配置相对直接运行 TypeScript 来说会复杂一点, 所以还是 ts-node 简单.
在依赖少的项目当中, 我改成了用 ts-node 来进行编译运行. 配置如下
{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"sourceMap": true,
"noImplicitAny": false,
"noImplicitThis": true,
"strictNullChecks": false,
"moduleResolution": "node",
// Node 当前还没有支持直接运行 import/export 语法, 需要编译到 CommonJS
"module": "commonjs",
"target": "es2016",
"jsx": "react",
"lib": ["es2016"],
"types": ["node"],
"baseUrl": "./example/",
"paths": {
"models": ["./example/models"]
},
"plugins": []
}
}
其实主要修改就 commonjs 那一行, 然后就是加上参数运行
ts-node -P tsconfig-node.json -r tsconfig-paths/register example/gen-router.ts
注意命令当中的 tsconfig-paths. 这里的 -r 是指定 register.
ts-node 是先进行编译再运行的, 但是引用的路径没有全都替换掉.
比如我在 tsconfig.json 里设置了 baseUrl 然后内部引用是简写的, a/b/c,
拿到 Node 本身去运行的时候是不知道这个 a/b/c 对应到哪里,
所以 tsconfig-paths/register 就提供 Node 运行时的方案, 动态查找依赖.
至少这样 Node register 改写以后, 查找模块就能正确进行了.
其他
另外 TypeScript 编译 import 语法时会产生一个 .default 属性.
对于 CommonJS 的模块, 这个 .default 属性是多余的. 所以引用的写法要做调整.
import * as fs from "fs"; import * as path from "path"; import * as prettier from "prettier";
这个可能跟 tsconfig.json 里其他的配置有关联, 我没继续深挖.
整体的代码参考 https://github.com/jimengio/meson-form/pull/62/files
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]