在普通的Svelte项目(没有SvelteKit)中,静态文件位于public
目录中,当运行npm run build
(rollup -c
)时,src
文件夹被编译成public/build
,然后公用文件夹可以托管在某个地方。
现在,我将(一个已经存在的) Svelte项目转换为Vite,静态文件仍然在public
下,但是当运行npm run build
(vite build
)时,所有内容都绑定到dist
目录中。因此,public
目录中的所有文件实际上都在项目中复制和存在两次。这意味着,当更改或添加某些内容(不影响应用程序逻辑)时,项目需要重新构建,然后才能重新部署。
这是否可以通过配置进行更改,即所有已编译的文件都再次添加到public
目录中,或者静态文件直接驻留在dist
中,而在构建过程中没有复制任何内容?
编辑:项目应该仍然能够在开发模式npm run dev
(vite
)中运行,并提供资产。
发布于 2022-03-06 13:42:20
是的,您可以将公共文件保存在dist
中,而无需复制,但这有点“黑客”。
首先,需要禁用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
中提供这些文件,需要额外的黑客攻击。您需要创建一个自定义服务器来实现这一点。(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()
并在"dev": "vite"
中用"dev": "node server.js"
替换package.json
https://stackoverflow.com/questions/71368209
复制相似问题