如何使用 Vite 配置 Svelte 项目,以便在构建期间不复制静态文件?
How to configure Svelte project with Vite so that the static files are not copied during the build?
在正常的 Svelte 项目(无 SvelteKit)中,静态文件位于 public
目录中,当 运行ning npm run build
(rollup -c
) src
文件夹被编译成 public/build
,然后 public 文件夹可以托管在某个地方。
我现在将(一个已经存在的)Svelte 项目切换到 Vite,静态文件仍在 public
下,但是当 运行ning npm run build
(vite build
) 时,一切都捆绑到 dist
目录中。所以public
目录下的所有文件其实都是复制过来的,在项目中存在两次。这意味着在更改或添加某些内容(不影响应用程序逻辑)时,项目需要先重建才能重新部署。
是否可以通过配置更改,将所有编译文件再次添加到 public
目录,或者静态文件直接驻留在 dist
中,并且在构建过程中不复制任何内容?
编辑:项目应该仍然可以 运行 在开发模式下 npm run dev
(vite
) 并提供资产
是的,您可以在 dist
中保留 public 个文件而无需复制,但这有点“黑客”。
首先您需要禁用 publicDir
选项以禁用复制。
然后禁用emptyOutdir
保留文件。
最后您可能想要清理旧资产,因此添加了一个 buildStart
挂钩,在构建开始时清理 dist/assets
。
最后的vite.config.js
(你可能想添加一些错误处理):
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import { rm } from 'fs/promises'
// https://vitejs.dev/config/
export default defineConfig(({ command }) => ({
plugins: [
svelte(),
{
buildStart() {
if (command === 'build')
rm('./dist/assets', { recursive: true }).catch(() => {})
}
},
],
publicDir: false,
build: {
emptyOutDir: false,
}
}))
更新: 要在 npm run dev
中提供这些文件,需要额外的 hack。您需要创建一个自定义服务器来实现这一点。 (vite好像没有提供配置方式。)
server.js
:
import express from 'express'
import { createServer as createViteServer } from 'vite'
// Or use require if nodejs complains about ES module
// const express = require('express')
// const { createServer: createViteServer } = require('vite')
async function createServer() {
const app = express()
// Create Vite server in middleware mode.
const vite = await createViteServer({
server: { middlewareMode: 'html'},
})
// Do not serve built index.html when visiting http://localhost:3000/
app.use(express.static('dist', { index: false }))
// Use vite's connect instance as middleware
app.use(vite.middlewares)
app.listen(3000)
}
createServer()
并在package.json
中用"dev": "node server.js"
替换"dev": "vite"
在正常的 Svelte 项目(无 SvelteKit)中,静态文件位于 public
目录中,当 运行ning npm run build
(rollup -c
) src
文件夹被编译成 public/build
,然后 public 文件夹可以托管在某个地方。
我现在将(一个已经存在的)Svelte 项目切换到 Vite,静态文件仍在 public
下,但是当 运行ning npm run build
(vite build
) 时,一切都捆绑到 dist
目录中。所以public
目录下的所有文件其实都是复制过来的,在项目中存在两次。这意味着在更改或添加某些内容(不影响应用程序逻辑)时,项目需要先重建才能重新部署。
是否可以通过配置更改,将所有编译文件再次添加到 public
目录,或者静态文件直接驻留在 dist
中,并且在构建过程中不复制任何内容?
编辑:项目应该仍然可以 运行 在开发模式下 npm run dev
(vite
) 并提供资产
是的,您可以在 dist
中保留 public 个文件而无需复制,但这有点“黑客”。
首先您需要禁用 publicDir
选项以禁用复制。
然后禁用emptyOutdir
保留文件。
最后您可能想要清理旧资产,因此添加了一个 buildStart
挂钩,在构建开始时清理 dist/assets
。
最后的vite.config.js
(你可能想添加一些错误处理):
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import { rm } from 'fs/promises'
// https://vitejs.dev/config/
export default defineConfig(({ command }) => ({
plugins: [
svelte(),
{
buildStart() {
if (command === 'build')
rm('./dist/assets', { recursive: true }).catch(() => {})
}
},
],
publicDir: false,
build: {
emptyOutDir: false,
}
}))
更新: 要在 npm run dev
中提供这些文件,需要额外的 hack。您需要创建一个自定义服务器来实现这一点。 (vite好像没有提供配置方式。)
server.js
:
import express from 'express'
import { createServer as createViteServer } from 'vite'
// Or use require if nodejs complains about ES module
// const express = require('express')
// const { createServer: createViteServer } = require('vite')
async function createServer() {
const app = express()
// Create Vite server in middleware mode.
const vite = await createViteServer({
server: { middlewareMode: 'html'},
})
// Do not serve built index.html when visiting http://localhost:3000/
app.use(express.static('dist', { index: false }))
// Use vite's connect instance as middleware
app.use(vite.middlewares)
app.listen(3000)
}
createServer()
并在package.json
"dev": "node server.js"
替换"dev": "vite"