我正在尝试使用以下配置为我的打字稿应用程序引用自定义模块快捷方式(即使用 ts
路径映射功能) .
Project structure
dist/
src/
lyrics/
... ts files
app/
... ts files
完整的项目结构在这里:github.com/adadgio/npm-lyrics-ts,当然没有提交dist文件夹)
tsconfig.json
{
"compilerOptions": {
"outDir": "dist",
"module": "commonjs",
"target": "es6",
"sourceMap": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"removeComments": true,
"noImplicitAny": false,
"baseUrl": ".",
"paths": {
"*": ["src/lyrics/*"], // to much here !! but none work
"zutils/*": ["./src/lyrics/*", "src/lyrics/utils/*", "dist/lyrics/utils/*"]
},
"rootDir": "."
},
"exclude": [
"dist",
"node_modules"
],
"include": [
"src/**/*.ts"
]
}
当我运行我的npm start / compile或watch脚本时,我没有得到Typescript错误 . 以下工作(Atom是我的IDE)
// string-utils.ts does exist, no IDE error, typescript DOES compile
`import { StringUtils } from 'zutils/string-utils';`
但我得到NodeJS跟随错误:
Error: Cannot find module 'zutils/string-utils'
at Function.Module._resolveFilename (module.js:470:15)
at Function.Module._load (module.js:418:25)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/home/adadgio/WebServer/projects/adadgio/npm-lyrics-ts/src/index.ts:7:1)
at Module._compile (module.js:571:32)
at Module.m._compile (/home/adadgio/WebServer/projects/adadgio/npm-lyrics-ts/node_modules/ts-node/src/index.ts:413:23)
at Module._extensions..js (module.js:580:10)
at Object.require.extensions.(anonymous function) [as .ts] (/home/adadgio/WebServer/projects/adadgio/npm-lyrics-ts/node_modules/ts-node/src/index.ts:416:12)
at Module.load (module.js:488:32)
看起来该模块正试图从 node_modules
文件夹中解析 . 我已经阅读了有关Typescript路径映射的文档,但我无法使其工作 .
1 回答
我对此做了很多研究 . 我正在使用atom,typescript和nodejs .
问题是,当你编译typescript时,它会搜索路径(要包含的.ts文件的路径) . 但是,最终编译的.js文件不会替换路径 .
The solution:
编译ts文件,使用tsconfig中的路径
使用脚本替换最终.js文件中的路径标记
运行节点应用程序
基本上,tsconfig的一部分看起来像这样
并考虑Rectangle.ts文件
Rectangle.ts所在的位置
我们跑
这将编译我们设置的所有.ts文件 . 在那里,路径将在运行时被替换,如果你得到错误,运行
并且搜索fiel wehere是未定义的路径包括 . 您将能够看到替换日志
然后我们留下了Rectangle.js(建成)
如您所见,@ Point将不存在,我们无法像这样运行节点应用程序 .
然而,为此,我创建了一个脚本,递归搜索js文件并通过上升到root然后到目标路径来替换令牌 .
有requirePaths.data文件,您可以在其中定义标记和路径 .
现在,这不是通用的,它只是我的热门脚本 . 请注意,结构是
从技术上讲,src中的app / model ...结构只是复制到src / build.tsc从/ src / app获取源代码并编译它 . 编译结果在/ src / build中
然后,有substitutePathsInJS.sh脚本 . 这个scand用于构建路径,每当它找到令牌@Rectangle时,它都会替换它(下面有更多解释......)代码:
这看起来令人困惑,但请考虑一下 . 我们有Rectangle.js文件 .
该脚本从requirePaths.data文件加载一堆输入标记,在这种情况下,让我们专注于行
脚本从./src运行,并给出根目录./src/build/src
脚本执行cd ./src/build/src
执行查找 . 在那里,它会收到
绝对的道路是
但我们现在不关心绝对路径 .
计算他从目录中获取的路径,这会产生类似的结果
他希望从目录中得到的地方
到目录
然后,在该字符串后面,我们添加从数据文件提供的路径
所以文件Rectangle.js的最终替换(在BUILD文件夹中的某个地方)是
before
after
哪个很糟糕,但我们并不关心js中的内容 . 主要是它有效 .
Drawbacks
您无法将其与代码监视器结合使用 . 监视tsc,然后,当代码更改完成后,执行自动tsc编译,然后自动运行shell路径替换,然后在最终的js文件上ping nodeJS,但由于某种原因,然后sh脚本替换路径,监视软件考虑是代码中的变化(不知道为什么,它已经从监视器中排除了构建)并再次编译 . 因此,你产生一个无限循环
您必须手动编译,一步一步,或者只是在tsc编译中使用monitor . 编写代码时,请运行替换并测试nodeJS功能 .
添加新的Class Food时,必须为它定义一个标记(@Food)和2个位置的文件路径(tsconfig)以及shell脚本的输入
使整个编译过程更长 . 老实说,无论如何,tsc占用了大部分时间,并且bash脚本并不是那么耗时......
使用mocha实现测试时,必须再次进行逐步编译,完成后,在最终的js文件上运行mocha . 但为此你可以编写脚本....
有些人通常只会替换@app或某些目录 . 问题是,无论何时移动源文件,都必须进行大量更改......
The good sides
当移动文件时,你改变一个字符串(在两个地方....)
没有更多的相对路径使大项目无法维护
这很有趣,但确实有效,我没有遇到重大问题(如果使用得当)