DEV Community

Pacharapol Withayasakpunt
Pacharapol Withayasakpunt

Posted on

TypeScript, simplified import paths, and what you have to be careful

As a response to this post,

Simplified import paths are easy for IDEs, especially VSCode, but hard for resolvers and Node.js itself.

So, you will need some additional packages,

  • tsconfig-paths
  • Babel

So, I had to put more things in package.json

{
  "scripts": {
    "run-ts": "ts-node -r tsconfig-paths/register -O '{\"module\":\"commonjs\",\"noImplicitAny\":false}'",
    "run-ts-dev": "ts-node-dev -r tsconfig-paths/register"
  },
  "devDependencies": {
    "@babel/cli": "^7.10.5",
    "@babel/core": "^7.10.5",
    "babel-plugin-module-resolver": "^4.0.0"
  }
}
Enter fullscreen mode Exit fullscreen mode
// tsconfig.json

{
  "compilerOptions": {
    "rootDir": "./src",
    "outDir": "./dist"
    "baseUrl": "./",
    "paths": {
      "@/*": [ "src/*" ]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
// .babelrc

{
  "plugins": [
    ["module-resolver", {
      "root": ["./dist"],
      "alias": {
        "@": "./dist"
      }
    }]
  ]
}
Enter fullscreen mode Exit fullscreen mode

Yes, it seems that you have to type out the aliases twice. Also, the syntaxes are a little different.

Now, for the essential commands,

yarn run-ts scripts/migration.ts
# or npm run run-ts -- scripts/migration.ts to run a short running scripts, e.g. migration

yarn run-ts-dev src/server.ts
# or npm run run-ts-dev -- src/server.ts to run a long running scripts, e.g. server

rimraf dist && tsc && babel dist -o dist
node dist/index.ts
# Yes, you can use Babel just to resolve paths. Babel onto itself as well.

# This is also possible.
rimraf dist && tsc
node -r tsconfig-paths/register dist/index.js
Enter fullscreen mode Exit fullscreen mode

There is one big problem. @babel/preset-typescript is not using tsconfig.json; therefore, Microsoft's Babel starter is just not enough. It doesn't recognize additional features like experimentalDecorators...

Never mind, it seems that I can tsc first, then babel onto itself.

  • This will make experimentalDecorators work without an explicit Babel plugin. I think Babel is a configuration hell.
  • I think TypeScript compiler already do much of what Babel supposed to do.
  • There is another gotcha, though. tsc doesn't remove the old directory / output. So the solution is rimraf dist first.

Top comments (0)