首页 > 解决方案 > 如何使用 ts-node 运行安装在 node_modules 中的 ts 脚本

问题描述

我有一个包含script.ts文件的包:

import path from 'path'
/* ... */
const loaded = require(path.resolve(process.cwd(), './src/dynamicPath/example.ts'))
// package.json
{
    "name": "mypackage",
    "bin": {
        "script": "./script.ts"
    }
}

它从安装到的存储库中加载打字稿文件。所以我不能编译是和使用节点,我需要使用ts-node

如果我运行ts-node script.ts,它工作正常

但是当它安装在./node-modules/.bin/script.ts. 如果我运行ts-node ./node-modules/.bin/scripts它不起作用:

(node:25931) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
xxx/node_modules/.bin/script.ts:1
import path from 'path'
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:915:16)
    ...

如果我添加's那么我type: module有这个错误:mypackagepackage.json

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /__/node_modules/mypackage/script.ts
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
    at Loader.getFormat (internal/modules/esm/loader.js:116:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:247:31)
    at async Loader.import (internal/modules/esm/loader.js:181:17)
    at async Object.loadESM (internal/process/esm_loader.js:68:5) {
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}

我怎样才能使打字稿脚本与node_modules外面的一样node_modules

我安装tsconfig.json的回购协议mypackage

{
    "compilerOptions": {
        "module": "commonjs",
        "esModuleInterop": true,
        "target": "es6",
        "lib": ["es2017"],
        "moduleResolution": "node",
        "outDir": "dist",
        "types": ["node"],
        "sourceMap": true
    },
    "include": ["src/**/*", "./node_modules/.bin/script", "./node_modules/mypackage/**"]
}

我试图避免使用postinstallnpm 脚本将文件复制到我的源代码中。

标签: typescriptnode-moduleses6-modulests-node

解决方案


  1. 确保您"esModuleInterop": true在两个tsconfigs中都有- 在mypackage和要安装mypackage的依赖项目中。

  2. 添加#!ts-nodescript.ts文件之上

  3. 无需这样ts-node ./node-modules/.bin/script做(在您安装mypackage的依赖项目npx script的目录中)


推荐阅读