esbuild-serve-2
Development server for ESBuild with API proxy and livereload.
Why?
Current esbuild-serve package is outdated and isn't maintained. ESBuild internal serve API is simple, but hasn't features like livereload, API proxy and HTML5 history API fallback
[WARNING] It's NOT a production server, only for development!
Features
- Static files serving from ESBuild
outdir
option or dir
serve option. - Serve index.html from main dir or given
indexPath
, supports HTML5 history API fallback. - Proxy API requests to prevent CORS errors.
- Live reload opened tabs when (re)build completed.
- Zero dependencies and small size. Server uses
http
module directly without large production HTTP libraries, like "express".
Installation
npm i esbuild-serve-2
Usage
Basic
By default server will start automatically at http://localhost:3000 after serve
call. Port can be customized in second argument ServerOptions
.
import path from 'path'
import serve from 'esbuild-serve-2'
serve(
{
entryPoints: ["./src/index.tsx"],
outdir: path.resolve(__dirname, './dist'),
},
{
indexPath: path.resolve(__dirname, './html/index.html'),
}
);
Custom HTTP server
Custom HTTP server can be passed in ServerOptions
. With this option server will not start automatically, call to server.listen()
required.
import path from 'path'
import http from 'http'
import serve from 'esbuild-serve-2'
const server = http.createServer()
serve(
{
entryPoints: ["./src/index.tsx"],
outdir: path.resolve(__dirname, './dist'),
},
{
server,
indexPath: path.resolve(__dirname, './html/index.html'),
}
);
server.listen(3000)
Proxy API requests
import path from 'path'
import serve from 'esbuild-serve-2'
serve(
{
entryPoints: ["./src/index.tsx"],
outdir: path.resolve(__dirname, './dist'),
},
{
indexPath: path.resolve(__dirname, './html/index.html'),
proxy: [
{ filter: /^\/api/, host: "localhost", port: 4000 },
{
filter: (req) => req.headers["content-type"] === "application/json",
host: "localhost",
port: 8080,
},
],
}
);
Options
Server Options
type ServerOptions = {
dir: string;
indexPath?: string;
port?: number
proxy?: ProxyOptions[];
server?: http.Server;
verbose?: boolean;
};
Proxy Options
type ProxyOptions = {
filter: RegExp | { (req: http.IncomingMessage): boolean };
host: string;
https?: boolean;
port?: number;
};