The tsx npm package is a CLI tool for running TypeScript and TSX files directly without pre-compilation. It's essentially a TypeScript execution and REPL for node.js, similar to how `node` works for JavaScript. It allows developers to quickly run scripts and prototypes written in TypeScript, including support for TSX (TypeScript with JSX syntax), which is commonly used in React development.
What are tsx's main functionalities?
Execute TypeScript files directly
Allows you to run a TypeScript file directly from the command line without needing to compile it first. This is particularly useful for quick scripts or during development.
tsx script.ts
REPL mode
Launches a REPL (Read-Eval-Print Loop) where you can type and execute TypeScript code interactively. This is useful for testing small snippets of code quickly.
tsx
Support for TSX
Enables execution of TSX files, which is TypeScript with JSX syntax. This is particularly useful for React developers who want to test components or scripts that include JSX.
ts-node is a very popular package that offers similar functionality to tsx. It provides the ability to execute TypeScript files directly and use TypeScript in a REPL environment. ts-node is widely used in the TypeScript community for development and scripting. Compared to tsx, ts-node has been around longer and has a larger user base, but both aim to simplify the TypeScript development workflow by removing the compilation step.
esbuild-runner offers a way to run TypeScript (and JavaScript) files using the esbuild bundler/compiler. It's focused on providing extremely fast compilation and execution, leveraging esbuild's performance. While esbuild-runner and tsx share the goal of simplifying the execution of TypeScript files, esbuild-runner emphasizes speed and is part of the broader ecosystem around the esbuild project.
tsx
TypeScript Execute (tsx): Node.js enhanced to run TypeScript & ESM files
Features
Blazing fast on-demand TypeScript & ESM compilation
💡 Protip: Looking to bundle your TypeScript project?
If you're looking for a dead simple way to bundle your TypeScript projects, take a look at pkgroll. It's an esbuild-enhanced Rollup that's auto configured based on your package.json!
About
tsx is a CLI command (alternative to node) for seamlessly running TypeScript & ESM in both commonjs & module package types.
This is for you if you ever wanted:
A command that can just run TypeScript code without dealing with configuration
Better interoperability in codebases that use ESM and CJS dependencies
Something really fast it's unnoticeable!
Quick start
Try tsx now without setup! Just pass in a TypeScript file:
npx tsx ./script.ts
Mission
Enhance Node.js with TypeScript support
Improve ESM <-> CJS interoperability as the ecosystem migrates to ESM
If you're using it in an npm project, install it as a development dependency:
npm install --save-dev tsx
Then you can reference it directly in the package.json#scripts object (you don't need npx here):
{
"scripts": {
"dev": "tsx ..."
}
}
To use the binary, you can call it with npx while in the project directory:
npx tsx ...
Global installation
If you want to use it in any arbitrary project without npx, install it globally:
npm install --global tsx
Then, you can call tsx directly:
tsx ...
Usage
tsx is a Node.js wrapper
tsx wraps around Node.js to enhance it with TypeScript support. Because it's a drop-in replacement for node, it supports all Node.js command-line flags.
# --no-warnings is a Node.js flag
tsx --no-warnings ./file.ts
Run TypeScript / ESM / CJS module
Pass in a file to run:
tsx ./file.ts
Custom tsconfig.json path
By default, tsconfig.json will be detected from the current working directory.
Pass in --clear-screen=false to disable clearing the screen on rerun
REPL
Start a TypeScript REPL by running with no arguments:
tsx
Cache
Modules transformations are cached in the system cache directory (TMPDIR). Transforms are cached by content hash, so duplicate dependencies are not re-transformed.
Set the --no-cache flag to disable the cache:
tsx --no-cache ./file.ts
Alternatively, use the TSX_DISABLE_CACHE environment variable:
TSX_DISABLE_CACHE=1 tsx ./file.ts
Node.js Loader
tsx is a standalone binary designed to be used in place of node, but sometimes you'll want to use node directly. For example, when adding TypeScript & ESM support to npm-installed binaries.
To use tsx as a Node.js loader, pass it in to the --import flag. This will add TypeScript & ESM support for both Module and CommonJS contexts.
node --import tsx ./file.ts
Or as an environment variable:
NODE_OPTIONS='--import tsx' node ./file.ts
Note: The loader is limited to adding support for loading TypeScript/ESM files. CLI features such as watch mode or suppressing "experimental feature" warnings will not be available.
ESM only loader
If you only need to add TypeScript support in a Module context, you can use the ESM loader:
Node.js v20.6.0 and above
node --import tsx/esm ./file.ts
Node.js v20.5.1 and below
node --loader tsx/esm ./file.ts
CommonJS only loader
If you only need to add TypeScript & ESM support in a CommonJS context, you can use the CJS loader:
node --require tsx/cjs ./file.ts
Hashbang
If you prefer to write scripts that doesn't need to be passed into tsx, you can declare it in the hashbang.
Simply add #!/usr/bin/env tsx at the top of your file:
Now, you can run the file without passing it into tsx:
$ ./file.ts hello
argv: [ 'hello' ]
VS Code debugging
Setup
Create the following configuration file in your project to setup debugging in VS Code:
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
/*
Each config in this array is an option in the debug drop-down
See below for configurations to add...
*/
],
}
Debugging method 1: Run tsx directly from VSCode
Add the following configuration to the configurations array in .vscode/launch.json:
{
"name": "tsx",
"type": "node",
"request": "launch",
// Debug current file in VSCode
"program": "${file}",
/*
Path to tsx binary
Assuming locally installed
*/
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/tsx",
/*
Open terminal when debugging starts (Optional)
Useful to see console.logs
*/
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
// Files to exclude from debugger (e.g. call stack)
"skipFiles": [
// Node.js internal core modules
"<node_internals>/**",
// Ignore all dependencies (optional)
"${workspaceFolder}/node_modules/**",
],
}
In VSCode, open the file you want to run
Go to VSCode's debug panel, select "tsx" in the drop down, and hit the play button (F5).
Debugging method 2: Attach to a running Node.js process
This method works for any Node.js process and it's not specific to tsx
Add the following configuration to the configurations array in .vscode/launch.json:
{"name":"Attach to process","type":"node","request":"attach","port":9229,"skipFiles":[// Node.js internal core modules"<node_internals>/**",// Ignore all dependencies (optional)"${workspaceFolder}/node_modules/**",],}
Run tsx with --inspect-brk in a terminal window:
tsx --inspect-brk ./your-file.ts
Go to VSCode's debug panel, select "Attach to process" in the drop down, and hit the play button (F5).
If there's a problem you're encountering or something you need help with, don't hesitate to take advantage of my Priority Support service where you can ask me questions in an exclusive forum. I'm well equppied to assist you with this project and would be happy to help you out! 🙂
FAQ
Why is it named tsx?
tsx stands for "TypeScript execute". Mirroring npx, which stands for "Node.js package execute".
The 3-character package name offers an elegant developer experience, allowing usage like: npx tsx ....
Unfortunately, it overlaps with React's TSX/JSX, which stands for "TypeScript XML".
They're both tools to run TypeScript files. But tsx does a lot more to improve the experience of using Node.js.
tsx just works. It's zero-config and doesn't require tsconfig.json to get started, making it easy for users that just want to run TypeScript code and not get caught up in the configuration.
It's a single binary with no peer-dependencies (e.g. TypeScript or esbuild), so there is no setup necessary, enabling usage that is elegant and frictionless for first-time users:
npx tsx ./script.ts
tsx is zero-config because it has smart detections built in. As a runtime, it detects what's imported to make many options in tsconfig.json redundant—which was designed for compiling matching files regardless of whether they're imported.
It seamlessly adapts between CommonJS and ESM package types by detecting how modules are loaded (require() or import) to determine how to compile them. It even adds support for require()ing ESM modules from CommonJS so you don't have to worry about your dependencies as the ecosystem migrates to ESM.
At the core, tsx is powered by esbuild for blazing fast TypeScript compilation, whereas ts-node (by default) uses the TypeScript compiler. Because esbuild doesn't type check, tsx is similar to ts-node --esm --swc (which uses the SWC compiler).
As a bonus, tsx also comes with a watcher to speed up your development.
There's an outdated dependency in tsx—can you update?
Dependencies are typically declared with SemVer ranges to allow updates. You can use the npm update <package name> command to automatically update them to the latest version within the defined range.
If the dependencies are out of the specified range, it indicates a potential breaking change that requires manual review. You're welcome to submit a pull request to initiate the upgrade.
TypeScript Execute (tsx): Node.js enhanced with esbuild to run TypeScript & ESM files
The npm package tsx receives a total of 3,749,987 weekly downloads. As such, tsx popularity was classified as popular.
We found that tsx demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.It has 0 open source maintainers collaborating on the project.
Package last updated on 27 Nov 2023
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.