时间:2021-05-18
公司项目代码是用 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?$/, exclude: [/node_modules/, path.join(__dirname, "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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
3.0迟迟没有发布release版本,现阶段在Vue项目中使用Typescript需要花不小的精力在工程的配置上面。主要的工作是webpack对TS,TSX的处
最近搞了一个webpack4+typescript的开发环境,折腾了很久现在记录一下。。。。本身环境比较好搞,但是热更新是个麻烦事儿本环境是基于webpack-
前言本文主要讲怎么写一个typescript的描述文件(以d.ts结尾的文件名,比如xxx.d.ts)。最近开始从js转ts了。但是要用到一些描述文件(d.ts
Intro最近在用nodejs写爬虫,之前的nodejs爬虫代码用js写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescript)重写一下
之前也写过webpack学习记录,项目中需要一个常用的webpack多页面配置,所以才动手,本着能写一行是一行的原则,开始了配置webpack之旅。定目录结构首