VPS 剩余价值计算器 是一个普通的 HTML + CSS + 非模块化函数式 JS 项目,使用 Vite 作为构建工具来打包 JS 和 CSS 文件,把 JS 和 CSS 代码内联形式到 HTML 文件,既通过 Vite 打包压缩减少页面大小,又满足打包后,多文件项目变为无依赖的单文件,方便各种环境部署的需求。

简化版本目录结构如下:

app/
├── static/
│   ├── css/
│   │   ├── 1.css
│   │   ├── 2.css
│   │   ├── 3.css
│   │   └── main.css
│   └── js/
│       ├── 1.js
│       ├── 2.js
│       └── 3.js
└── index.html

其中各文件内容

index.html

<html>
<head>
  <link rel="stylesheet" href="static/css/main.css">
</head>

<body>
  <div id="app"><h1>vite packaging</h1></div>
  <script src="static/js/1.js"></script>
  <script src="static/js/2.js"></script>
  <script src="static/js/3.js"></script>
</body>
</html>

main.css

@import './1.css';
@import './2.css';
@import './3.css';
body {
  text-align: center;
}

1.js

// 1.js
function greet(name) {
  return `Hello, ${name}!`;
}
console.log(greet("World"));

以上 index.html,引入 main.css 和 3个非模块化、函数式 js 文件,main.css 里面 import 了 3 个 css 文件。

# node 环境自行提前准备
# 初始化 vite 项目(无交互)
npm create vite@latest vite-app -- --template vanilla
cp vite-app/package.json .
npm install vite --save-dev
cat > vite.config.js <<'EOF'
import { defineConfig } from 'vite';
export default defineConfig({
    build: {
        emptyOutDir: false,  // 保留构建产物 <---- 执行多次 `npx vite build` 目标存在
        rollupOptions: {
        input: [
            './static/js/1.js',
        ],
        output: {
            //inlineDynamicImports: false,
            dir: 'build',    // 输出目录
            format: 'iife',  // JS 文件格式  <---- 重点,指定为函数式 JS 文件
            entryFileNames: '1.js'
        }
        }
    }
});
EOF
# 安装依赖
npm install
# 构建文件
npx vite build --config vite.js.config.js

以上打包出 build/1.js 文件,如果打包多个文件,编写多个配置文件,指定配置文件执行多次 npx vite build 命令即可。

最终结果:

文件从压缩减少了 10 kb,最重要的是,整个项目的多个 css 和 js 代码内联到 index.html 为独立无依赖单文件。

vite v6.3.2 building for production...
✓ 1 modules transformed.
build/jsq.js  8.76 kB │ gzip: 2.70 kB
✓ built in 123ms
vite v6.3.2 building for production...
✓ 1 modules transformed.
build/main.css  36.52 kB │ gzip: 7.85 kB