脚本编译器
用于节点.js的内存 Typescript 编译器,支持 缓存 财务报告和审定财务报表 自定义变压器
导言
需要 ts 是一个类似于 ts-节点 与少数差异.
想法是钩入Node.js的生命周期 require 在苍蝇上调用和编译 Typescription(在内存中)
以防万一,如果你不知道,Node.js拥有注册习惯的一等支持 需要扩展 用于解决和编译带有一定扩展名的文件。 例如:
require.extenstions['.ts'] = function (module, filename) {
var content = fs.readFileSync(filename, 'utf8')
module._compile(content, filename)
}
如果我们用 Typescript 编译器 API 来取代示例的函数正文,那么我们基本上可以得到入模的打字编译. 然而,还有许多其他事情需要处理.
- 使源图工作,这样错误会指向Typescript 代码,而不是内存 Javascript中编译的.
- 支持打字扩展
- 引入某种缓存来避免重编未修改的文件. Typescript 编译器不是最快的编译器之一,因此需要缓存.
目标
编写此模块的目标如下:
- 可以在不设置磁盘编译器的情况下使用 Typescript工作
- 保持入室编译速度快. 为此,我们不进行类型检查。 您的IDE 或文本编辑器应该这样做 .
- 缓存磁盘上的已编译输出, 以避免重编未修改的文件 。 一个体面的项目有100多份源文件 我们通常不会一起改变所有的文件 所编译的缓存也与所编译的输出不同.
- 用于监视者清除缓存的曝光助手功能 。 大多数Node.js应用程序使用某种监视器来监视文件的更改,然后重新启动进程. 此软件包所暴露的帮助者,允许监视者清理已更改文件的缓存.
- 添加自定义变压器支持 .
使用量
这个模块预先配置了所有AdonisJS应用程序,理想的是你不需要自己去挖掘设置过程. 但是,如果你在AdonisJS之外使用它,那么就遵循以下设置过程.
npm i -D @adonisjs/require-ts
然后要求它作为节点 Js需要钩子
node -r @adonisjs/require-ts/build/register app.ts
我亲自为上面的指挥官 设计出一个狂欢的化名.
alias tsnode="node -r @adonisjs/require-ts/build/register"
然后运行如下:
tsnode app.ts
程序用途
这个软件包的主要目标是揭露一个程序API,其他人可以用来创建自己的构建工具或命令.
register
const { register } = require('@adonisjs/require-ts')
/**
* Require ts will resolve the "tsconfig.json" file from this
* path. tsconfig.json file is required to compile the code as * per the project requirements
*/
const appRoot = __dirname
const options = {
cache: true,
cachePath: join(require.resolve('node_modules'), '.cache/your-app-name'),
transformers: {
before: [],
after: [],
afterDeclarations: [],
},
}
register(appRoot, options)
/**
* From here on you can import the typescript code
*/
require('./typescript-app-entrypoint.ts')
这个 register 方法接受用于配置缓存和执行变压器的可选对象.
cache: 是否配置缓存cachePath: 将缓存输出写入何处transformers:带有变压器的物体,在不同生命周期被执行. 读取 变压器 节.
该寄存器方法为Node.js全局命名空间增加了两个全局属性.
compiler: 引用编译器,即正在编译源代码. 您可以通过以下方式访问:const { symbols } = require('@adonisjs/require-ts') console.log(global[symbols.compiler])config: 引用配置解析器tsconfig.json文档。 您可以通过以下方式访问:const { symbols } = require('@adonisjs/require-ts') console.log(global[symbols.config])
getWatcherHelpers
观察者帮助者允许观察者在不同的事件中清理缓存. 这是你如何使用它
const { getWatcherHelpers } = require('@adonisjs/require-ts')
/**
* Require ts will resolve the "tsconfig.json" file from this
* path. tsconfig.json file is required to compile the code as * per the project requirements
*/
const appRoot = __dirname
/**
* Same as what you passed to the `register` method
*/
const cachePath = join(require.resolve('node_modules'), '.cache/your-app-name')
const helpers = getWatcherHelpers(appRoot, cachePath)
helpers.clear('./relative/path/from/app/root')
这就是你应该如何设置流量
-
第一次启动监视器时清理整个缓存.
helpers.clear()。没有争论的意思,清除一切 -
为刚刚更改的文件清理缓存 .
helpers.clear('./file/path') -
检查配置文件是否以会影响编译输出的方式更改 。 如果是,则清除所有缓存文件.
if (helpers.isConfigStale()) { helpers.clear() // clear all files from cache }
缓存
缓存对我们很重要 从磁盘上读取所编译的输出比用Typescript重新将同一份文件相编译快得多.
这就是我们如何执行缓冲.
- 创建一个
md5 hash使用 重击 软件包. - 检查缓存输出与散列名称相同 .
- 如果文件存在, 则将其输出传递给 Node.js
module._compile方法. - 否则,使用 Typescript 编译器 API 编译文件并在磁盘上缓存
模块本身并不费心去清理被堆积的缓存文件. 意思是,缓存会长得像草.
然而,我们暴露出帮助者功能来清理缓存. 通常,你会使用它们 与文件监视器喜欢 nodemon 以清除已更改文件的缓存.
与 ts- 节点的差异
ts-node 财务报告和审定财务报表 require-ts 有一些但重要的区别.
ts-node也输入检查 Typescript 代码。 它们允许不进行类型检查而配置 ts-node 。 但总的来说,他们支付额外的设置成本 仅仅通过考虑类型检查.ts-node没有在磁盘上卡通的概念。 这对我们来说是一个交易中断器. 那么为什么不把这个功能贡献给ts-node呢?我们可以的 但是为了使缓存正常工作,模块需要让守望者暴露出帮助者来清理缓存,而我不认为Ts-node会对此烦恼.ts-node装有内置还原装置的船只。 我们不想自找麻烦 同样地,将代码库的焦点放在一个单一的使用案例上. 你用得着 @ adonisjs/ repl (英语) (原始内容存档于2019-09-26). for the RePL support.
这些差异很小,但总体影响最大.
变形器
Typescript 编译器 API 支持变压器在编译阶段进行AST的变换/调制. 给 你可以了解变压器的一般情况.
与 require-ts,可以将变压器在 tsconfig.json 在使用程序 API 时,将文件或通过内线.
以下是 tsconfig.json 文件的例子
{
"compilerOptions": {},
"transformers": {
"before": ["./transformer-before"],
"after": ["./transformer-after"],
"afterDeclarations": ["./transformer-after-declarations"]
}
}
变压器阵列接受来自 appRoot。变压器模块必须导出以下函数:
export default transformerBefore(ts: typescript, appRoot: string) {
return function transformerFactory (context) {}
}