1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
Let's write a simple HTTP server using the built-in `Bun.serve` API. First, create a fresh directory.
```bash
$ mkdir quickstart
$ cd quickstart
```
Run `bun init` to scaffold a new project. It's an interactive tool; for this tutorial, just press `enter` to accept the default answer for each prompt.
```bash
$ bun init
bun init helps you get started with a minimal project and tries to
guess sensible defaults. Press ^C anytime to quit.
package name (quickstart):
entry point (index.ts):
Done! A package.json file was saved in the current directory.
+ index.ts
+ .gitignore
+ tsconfig.json (for editor auto-complete)
+ README.md
To get started, run:
bun run index.ts
```
Since our entry point is a `*.ts` file, Bun generates a `tsconfig.json` for you. If you're using plain JavaScript, it will generate a [`jsconfig.json`](https://code.visualstudio.com/docs/languages/jsconfig) instead.
## Run a file
Open `index.ts` and paste the following code snippet, which implements a simple HTTP server with [`Bun.serve`](/docs/api/http).
```ts
const server = Bun.serve({
port: 3000,
fetch(req) {
return new Response("Bun!");
},
});
console.log(`Listening on http://localhost:${server.port} ...`);
```
<!--
### TypeScript
If you're using TypeScript, you may see a type error on the `Bun` global. To fix this, install `bun-types`.
```sh
$ bun add -d bun-types
```
Then add the following line to your `compilerOptions` in `tsconfig.json`.
```json-diff#tsconfig.json
{
"compilerOptions": {
+ "types": ["bun-types"]
}
}
``` -->
Run the file from your shell.
```bash
$ bun index.ts
Listening on http://localhost:3000 ...
```
Visit [http://localhost:3000](http://localhost:3000) to test the server. You should see a simple page that says "Bun!".
## Run a script
Bun can also execute `"scripts"` from your `package.json`. Add the following script:
```json-diff
{
"name": "quickstart",
"module": "index.ts",
"type": "module",
+ "scripts": {
+ "start": "bun run index.ts"
+ },
"devDependencies": {
"bun-types": "^0.7.0"
}
}
```
Then run it with `bun run start`.
```bash
$ bun run start
$ bun run index.ts
Listening on http://localhost:3000 ...
```
{% callout %}
⚡️ **Performance** — `bun run` is roughly 28x faster than `npm run` (6ms vs 170ms of overhead).
{% /callout %}
## Install a package
Let's make our server a little more interesting by installing a package. First install the `figlet` package and its type declarations. Figlet is a utility for converting strings into ASCII art.
```bash
$ bun add figlet
$ bun add -d @types/figlet # TypeScript users only
```
Update `index.ts` to use `figlet` in the `fetch` handler.
```ts-diff
+ import figlet from "figlet";
const server = Bun.serve({
fetch() {
+ const body = figlet.textSync("Bun!");
+ return new Response(body);
- return new Response("Bun!");
},
port: 3000,
});
```
Restart the server and refresh the page. You should see a new ASCII art banner.
```txt
____ _
| __ ) _ _ _ __ | |
| _ \| | | | '_ \| |
| |_) | |_| | | | |_|
|____/ \__,_|_| |_(_)
```
|