Skip to content

Commit 68c21fe

Browse files
committed
[breaking] do a single bundling with Vite removing esbuild
1 parent 52c0f99 commit 68c21fe

File tree

20 files changed

+116
-166
lines changed

20 files changed

+116
-166
lines changed

.changeset/tidy-pets-tan.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@sveltejs/adapter-cloudflare-workers': patch
3+
'@sveltejs/adapter-netlify': patch
4+
'@sveltejs/adapter-node': patch
5+
'@sveltejs/adapter-vercel': patch
6+
'@sveltejs/kit': patch
7+
---
8+
9+
[breaking] do a single bundling with Vite removing esbuild

documentation/docs/80-adapter-api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export default function (options) {
1414
/** @type {import('@sveltejs/kit').Adapter} */
1515
return {
1616
name: 'adapter-package-name',
17+
serverEntryPoint: 'adapter-package-name/entry',
1718
async adapt({ utils, config }) {
1819
// adapter implementation
1920
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import netlify from '@sveltejs/adapter-netlify';
1+
import adapter from '@sveltejs/adapter-netlify';
22

33
export default {
44
kit: {
5-
adapter: netlify(),
5+
adapter: adapter(),
66
target: '#svelte'
77
}
88
};

packages/adapter-cloudflare-workers/files/entry.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
// TODO hardcoding the relative location makes this brittle
2-
import { init, render } from '../output/server/app.js';
1+
// $server-build doesn't exist until the app is built
2+
// @ts-ignore
3+
import { init, render } from '$server-build';
34
import { getAssetFromKV, NotFoundError } from '@cloudflare/kv-asset-handler';
45

56
init();

packages/adapter-netlify/files/entry.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
// TODO hardcoding the relative location makes this brittle
2-
import { init, render } from '../output/server/app.js';
1+
// $server-build doesn't exist until the app is built
2+
// @ts-ignore
3+
import { init, render } from '$server-build';
34

45
init();
56

packages/adapter-netlify/index.js

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import { appendFileSync, existsSync, readFileSync, writeFileSync } from 'fs';
22
import { join, resolve } from 'path';
33
import { fileURLToPath } from 'url';
4-
import esbuild from 'esbuild';
54
import toml from '@iarna/toml';
65

7-
/**
8-
* @typedef {import('esbuild').BuildOptions} BuildOptions
9-
*/
10-
116
/** @type {import('.')} */
12-
export default function (options) {
7+
export default function () {
138
return {
149
name: '@sveltejs/adapter-netlify',
10+
serverEntryPoint: '@sveltejs/adapter-netlify/entry',
1511

1612
async adapt({ utils }) {
1713
// "build" is the default publish directory when Netlify detects SvelteKit
@@ -24,24 +20,7 @@ export default function (options) {
2420
const files = fileURLToPath(new URL('./files', import.meta.url));
2521

2622
utils.log.minor('Generating serverless function...');
27-
utils.copy(join(files, 'entry.js'), '.svelte-kit/netlify/entry.js');
28-
29-
/** @type {BuildOptions} */
30-
const default_options = {
31-
entryPoints: ['.svelte-kit/netlify/entry.js'],
32-
// Any functions in ".netlify/functions-internal" are bundled in addition to user-defined Netlify functions.
33-
// See https://github.com/netlify/build/pull/3213 for more details
34-
outfile: '.netlify/functions-internal/__render.js',
35-
bundle: true,
36-
inject: [join(files, 'shims.js')],
37-
platform: 'node'
38-
};
39-
40-
const build_options =
41-
options && options.esbuild ? await options.esbuild(default_options) : default_options;
42-
43-
await esbuild.build(build_options);
44-
23+
utils.copy(files, '.netlify');
4524
writeFileSync(join('.netlify', 'package.json'), JSON.stringify({ type: 'commonjs' }));
4625

4726
utils.log.minor('Prerendering static pages...');

packages/adapter-netlify/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
".": {
1313
"import": "./index.js"
1414
},
15+
"./entry": {
16+
"import": "./files/entry.js"
17+
},
1518
"./package.json": "./package.json"
1619
},
1720
"main": "index.js",
@@ -26,8 +29,7 @@
2629
"check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore"
2730
},
2831
"dependencies": {
29-
"@iarna/toml": "^2.2.5",
30-
"esbuild": "^0.13.4"
32+
"@iarna/toml": "^2.2.5"
3133
},
3234
"devDependencies": {
3335
"@sveltejs/kit": "workspace:*"

packages/adapter-node/README.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,13 @@ export default {
1515
adapter: adapter({
1616
// default options are shown
1717
out: 'build',
18-
precompress: false,
19-
env: {
20-
host: 'HOST',
21-
port: 'PORT'
22-
}
18+
precompress: false
2319
})
2420
}
2521
};
2622
```
2723

28-
## Options
24+
## Build Options
2925

3026
### entryPoint
3127

@@ -39,15 +35,17 @@ The directory to build the server to. It defaults to `build` — i.e. `node buil
3935

4036
Enables precompressing using gzip and brotli for assets and prerendered pages. It defaults to `false`.
4137

42-
### env
38+
## Runtime Options
39+
40+
### Environment variables
4341

4442
By default, the server will accept connections on `0.0.0.0` using port 3000. These can be customised with the `PORT` and `HOST` environment variables:
4543

4644
```
4745
HOST=127.0.0.1 PORT=4000 node build
4846
```
4947

50-
You can specify different environment variables if necessary using the `env` option.
48+
You can also specify `SOCKET_PATH` if you'd like to use a Unix domain socket or Windows named pipe.
5149

5250
## Middleware
5351

packages/adapter-node/index.js

Lines changed: 8 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,5 @@
1-
import esbuild from 'esbuild';
2-
import {
3-
createReadStream,
4-
createWriteStream,
5-
existsSync,
6-
readFileSync,
7-
statSync,
8-
writeFileSync
9-
} from 'fs';
10-
import { join, resolve } from 'path';
1+
import { createReadStream, createWriteStream, existsSync, statSync, writeFileSync } from 'fs';
2+
import { join } from 'path';
113
import { pipeline } from 'stream';
124
import glob from 'tiny-glob';
135
import { fileURLToPath } from 'url';
@@ -16,22 +8,19 @@ import zlib from 'zlib';
168

179
const pipe = promisify(pipeline);
1810

19-
/**
20-
* @typedef {import('esbuild').BuildOptions} BuildOptions
21-
*/
22-
2311
/** @type {import('.')} */
2412
export default function ({
25-
entryPoint = '.svelte-kit/node/index.js',
13+
// TODO: add ability to customize entry point to build/index.js
14+
// entryPoint = '.svelte-kit/node/index.js',
2615
out = 'build',
2716
precompress,
28-
env: { path: path_env = 'SOCKET_PATH', host: host_env = 'HOST', port: port_env = 'PORT' } = {},
29-
esbuild: esbuild_config
17+
env: { path: path_env = 'SOCKET_PATH', host: host_env = 'HOST', port: port_env = 'PORT' } = {}
3018
} = {}) {
3119
return {
3220
name: '@sveltejs/adapter-node',
21+
serverEntryPoint: '@sveltejs/adapter-node/entry',
3322

34-
async adapt({ utils, config }) {
23+
async adapt({ utils }) {
3524
utils.rimraf(out);
3625

3726
utils.log.minor('Copying assets');
@@ -58,54 +47,7 @@ export default function ({
5847
)}] || (!path && 3000);`
5948
);
6049

61-
/** @type {BuildOptions} */
62-
const defaultOptions = {
63-
entryPoints: ['.svelte-kit/node/middlewares.js'],
64-
outfile: join(out, 'middlewares.js'),
65-
bundle: true,
66-
external: Object.keys(JSON.parse(readFileSync('package.json', 'utf8')).dependencies || {}),
67-
format: 'esm',
68-
platform: 'node',
69-
target: 'node14',
70-
inject: [join(files, 'shims.js')],
71-
define: {
72-
APP_DIR: `"/${config.kit.appDir}/"`
73-
}
74-
};
75-
const build_options = esbuild_config ? await esbuild_config(defaultOptions) : defaultOptions;
76-
await esbuild.build(build_options);
77-
78-
utils.log.minor('Building SvelteKit server');
79-
/** @type {BuildOptions} */
80-
const default_options_ref_server = {
81-
entryPoints: [entryPoint],
82-
outfile: join(out, 'index.js'),
83-
bundle: true,
84-
format: 'esm',
85-
platform: 'node',
86-
target: 'node14',
87-
// external exclude workaround, see https://github.com/evanw/esbuild/issues/514
88-
plugins: [
89-
{
90-
name: 'fix-middlewares-exclude',
91-
setup(build) {
92-
// Match an import of "middlewares.js" and mark it as external
93-
const internal_middlewares_path = resolve('.svelte-kit/node/middlewares.js');
94-
const build_middlewares_path = resolve(out, 'middlewares.js');
95-
build.onResolve({ filter: /\/middlewares\.js$/ }, ({ path, resolveDir }) => {
96-
const resolved = resolve(resolveDir, path);
97-
if (resolved === internal_middlewares_path || resolved === build_middlewares_path) {
98-
return { path: './middlewares.js', external: true };
99-
}
100-
});
101-
}
102-
}
103-
]
104-
};
105-
const build_options_ref_server = esbuild_config
106-
? await esbuild_config(default_options_ref_server)
107-
: default_options_ref_server;
108-
await esbuild.build(build_options_ref_server);
50+
utils.copy('.svelte-kit/output/server/', 'build/');
10951

11052
utils.log.minor('Prerendering static pages');
11153
await utils.prerender({

packages/adapter-node/package.json

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@
88
},
99
"homepage": "https://kit.svelte.dev",
1010
"type": "module",
11+
"main": "index.js",
12+
"types": "index.d.ts",
1113
"exports": {
1214
".": {
1315
"import": "./index.js"
1416
},
17+
"./entry": {
18+
"import": "./files/index.js"
19+
},
20+
"./middlewares": {
21+
"import": "./files/middlewares.js"
22+
},
1523
"./package.json": "./package.json"
1624
},
17-
"main": "index.js",
18-
"types": "index.d.ts",
19-
"files": [
20-
"files",
21-
"index.d.ts"
22-
],
2325
"scripts": {
2426
"dev": "rollup -cw",
2527
"build": "rollup -c",
@@ -30,7 +32,6 @@
3032
"prepublishOnly": "npm run build"
3133
},
3234
"dependencies": {
33-
"esbuild": "^0.13.4",
3435
"tiny-glob": "^0.2.9"
3536
},
3637
"devDependencies": {

packages/adapter-node/rollup.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default [
1111
sourcemap: true
1212
},
1313
plugins: [nodeResolve(), commonjs(), json()],
14-
external: ['../output/server/app.js', ...require('module').builtinModules]
14+
external: ['$server-build', ...require('module').builtinModules]
1515
},
1616
{
1717
input: 'src/index.js',
@@ -21,7 +21,7 @@ export default [
2121
sourcemap: true
2222
},
2323
plugins: [nodeResolve(), commonjs(), json()],
24-
external: ['./middlewares.js', './env.js', ...require('module').builtinModules]
24+
external: ['./middlewares.js', '$server-build', ...require('module').builtinModules]
2525
},
2626
{
2727
input: 'src/shims.js',

packages/adapter-node/src/index.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
// @ts-ignore
2-
import { path, host, port } from './env.js';
3-
import { assetsMiddleware, kitMiddleware, prerenderedMiddleware } from './middlewares.js';
1+
import './shims';
2+
import { assetsMiddleware, kitMiddleware, prerenderedMiddleware } from './middlewares';
43
import compression from 'compression';
54
import polka from 'polka';
65

6+
// options
7+
const path = process.env['SOCKET_PATH'] || false;
8+
const host = process.env['HOST'] || '0.0.0.0';
9+
const port = process.env['PORT'] || (!path && 3000);
10+
711
const server = polka().use(
812
// https://github.com/lukeed/polka/issues/173
9-
// @ts-ignore - nothing we can do about so just ignore it
13+
// @ts-expect-error - nothing we can do about so just ignore it
1014
compression({ threshold: 0 }),
1115
assetsMiddleware,
1216
kitMiddleware,
1317
prerenderedMiddleware
1418
);
1519

16-
const listenOpts = { path, host, port };
17-
18-
server.listen(listenOpts, () => {
20+
server.listen({ path, host, port }, () => {
1921
console.log(`Listening on ${path ? path : host + ':' + port}`);
2022
});
2123

packages/adapter-node/src/middlewares.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
// TODO hardcoding the relative location makes this brittle
2-
// Also, we need most of the logic in another file for testing because
3-
// ../output/server/app.js doesn't exist when we run the tests
1+
// $server-build doesn't exist until the app is built
42
// @ts-ignore
5-
import { init, render } from '../output/server/app.js';
3+
import { init, render } from '$server-build';
64
import { create_kit_middleware } from './kit-middleware.js';
75

86
import fs from 'fs';

packages/adapter-node/src/shims.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import { createRequire } from 'module';
2-
export { fetch, Response, Request, Headers } from '@sveltejs/kit/install-fetch';
1+
import { fetch, Response, Request, Headers } from '@sveltejs/kit/install-fetch';
32

4-
// esbuild automatically renames "require"
5-
// So we still have to use Object.defineProperty here
6-
Object.defineProperty(globalThis, 'require', {
7-
enumerable: true,
8-
value: createRequire(import.meta.url)
9-
});
3+
if (!globalThis.fetch) {
4+
// @ts-expect-error
5+
globalThis.fetch = fetch;
6+
// @ts-expect-error
7+
globalThis.Response = Response;
8+
// @ts-expect-error
9+
globalThis.Request = Request;
10+
globalThis.Headers = Headers;
11+
}

packages/adapter-vercel/files/entry.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
// $server-build doesn't exist until the app is built
2+
// @ts-ignore
3+
import { init, render } from '$server-build';
14
import { getRawBody } from '@sveltejs/kit/node';
25

3-
// TODO hardcoding the relative location makes this brittle
4-
import { init, render } from '../output/server/app.js';
5-
66
init();
77

88
export default async (req, res) => {

packages/adapter-vercel/index.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ export default function (options) {
2323
lambda: join(dir, 'functions/node/render')
2424
};
2525

26-
// TODO ideally we'd have something like utils.tmpdir('vercel')
27-
// rather than hardcoding '.svelte-kit/vercel/entry.js', and the
28-
// relative import from that file to output/server/app.js
29-
// would be controlled. at the moment we're exposing
30-
// implementation details that could change
26+
// TODO ideally we'd have something like utils.tmpdir('vercel') rather
27+
// than hardcoding '.svelte-kit/vercel/entry.js'. At the moment we're
28+
// exposing implementation details that could change
3129
utils.log.minor('Generating serverless function...');
3230
utils.copy(join(files, 'entry.js'), '.svelte-kit/vercel/entry.js');
3331

0 commit comments

Comments
 (0)