diff --git a/.changeset/tiny-socks-sparkle.md b/.changeset/tiny-socks-sparkle.md new file mode 100644 index 000000000000..62f494d853b1 --- /dev/null +++ b/.changeset/tiny-socks-sparkle.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-node': patch +--- + +Bundle server-side app during adapt phase diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js index 6b7192aa6136..9ac22d0b0eca 100644 --- a/packages/adapter-node/index.js +++ b/packages/adapter-node/index.js @@ -1,6 +1,7 @@ -import { copyFileSync } from 'fs'; +import { readFileSync } from 'fs'; import { join } from 'path'; import { fileURLToPath } from 'url'; +import esbuild from 'esbuild'; /** * @param {{ @@ -18,11 +19,17 @@ export default function ({ out = 'build' } = {}) { utils.copy_client_files(static_directory); utils.copy_static_files(static_directory); - utils.log.minor('Copying server'); - utils.copy_server_files(out); - + utils.log.minor('Building server'); const files = fileURLToPath(new URL('./files', import.meta.url)); - copyFileSync(`${files}/server.js`, `${out}/index.js`); + utils.copy(files, '.svelte-kit/node'); + await esbuild.build({ + entryPoints: ['.svelte-kit/node/index.js'], + outfile: join(out, 'index.js'), + bundle: true, + external: Object.keys(JSON.parse(readFileSync('package.json', 'utf8')).dependencies || {}), + format: 'esm', + platform: 'node' + }); utils.log.minor('Prerendering static pages'); await utils.prerender({ diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 47367355937e..ae47764b4d9f 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -20,6 +20,9 @@ "check-format": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", "prepublishOnly": "npm run build" }, + "dependencies": { + "esbuild": "^0.12.5" + }, "devDependencies": { "@rollup/plugin-json": "^4.1.0", "@sveltejs/kit": "workspace:*", diff --git a/packages/adapter-node/rollup.config.js b/packages/adapter-node/rollup.config.js index dd33517bc2fc..f3e467c1f300 100644 --- a/packages/adapter-node/rollup.config.js +++ b/packages/adapter-node/rollup.config.js @@ -5,10 +5,10 @@ import json from '@rollup/plugin-json'; export default { input: 'src/index.js', output: { - file: 'files/server.js', + file: 'files/index.js', format: 'esm', sourcemap: true }, plugins: [nodeResolve(), commonjs(), json()], - external: ['./app.js', ...require('module').builtinModules] + external: ['../output/server/app.js', ...require('module').builtinModules] }; diff --git a/packages/adapter-node/src/index.js b/packages/adapter-node/src/index.js index 57f241238fc5..b678c3c978c3 100644 --- a/packages/adapter-node/src/index.js +++ b/packages/adapter-node/src/index.js @@ -1,10 +1,11 @@ +import './require_shim'; import { createServer } from './server'; -/*eslint import/no-unresolved: [2, { ignore: ['\.\/app\.js$'] }]*/ -import * as app from './app.js'; +// TODO hardcoding the relative location makes this brittle +import { render } from '../output/server/app.js'; // eslint-disable-line import/no-unresolved const { HOST = '0.0.0.0', PORT = 3000 } = process.env; -const instance = createServer({ render: app.render }).listen(PORT, HOST, () => { +const instance = createServer({ render }).listen(PORT, HOST, () => { console.log(`Listening on port ${PORT}`); }); diff --git a/packages/adapter-node/src/require_shim.js b/packages/adapter-node/src/require_shim.js new file mode 100644 index 000000000000..f335a1e3bde0 --- /dev/null +++ b/packages/adapter-node/src/require_shim.js @@ -0,0 +1,2 @@ +import { createRequire } from 'module'; +global.require = createRequire(import.meta.url); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b60bb720ce05..0e7a7226ca21 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,12 +95,15 @@ importers: '@sveltejs/kit': workspace:* c8: ^7.7.2 compression: ^1.7.4 + esbuild: ^0.12.5 node-fetch: ^3.0.0-beta.9 polka: ^1.0.0-next.15 rollup: ^2.47.0 sirv: ^1.0.12 typescript: ^4.2.4 uvu: ^0.5.1 + dependencies: + esbuild: 0.12.5 devDependencies: '@rollup/plugin-json': 4.1.0_rollup@2.47.0 '@sveltejs/kit': link:../kit