返回笔记列表

Next.js打包时静态资源配置

Next.js打包时,如果选用standalone模型,则默认public和static不会打包,如果靠每次手动复制就比较麻烦。可通过脚本在每次打包时自动复制。

Next.js打包时,如果选用standalone模型,则默认public和static不会打包,如果靠每次手动复制就比较麻烦。可通过脚本在每次打包时自动复制。

next.config.js

打包设置为standalone模式

const nextConfig: NextConfig = {
  output: "standalone",
};

新增文件

scripts/copy-standalone-assets.mjs

import { cpSync, existsSync, mkdirSync } from "node:fs";
import { join } from "node:path";

const root = process.cwd();
const standaloneDir = join(root, ".next", "standalone");

if (!existsSync(standaloneDir)) {
  console.error(
    "Missing .next/standalone. Set output: 'standalone' in next.config and run next build first."
  );
  process.exit(1);
}

const publicDir = join(root, "public");
const staticDir = join(root, ".next", "static");

if (existsSync(publicDir)) {
  cpSync(publicDir, join(standaloneDir, "public"), { recursive: true });
  console.log("Copied public -> .next/standalone/public");
}

if (!existsSync(staticDir)) {
  console.error("Missing .next/static after build.");
  process.exit(1);
}

const standaloneNextDir = join(standaloneDir, ".next");
mkdirSync(standaloneNextDir, { recursive: true });
cpSync(staticDir, join(standaloneNextDir, "static"), { recursive: true });
console.log("Copied .next/static -> .next/standalone/.next/static");

修改package.json

  "scripts": {
    "dev": "next dev",
    "build": "next build && node scripts/copy-standalone-assets.mjs",
  },

启动项目

module.exports = {
  apps: [
    {
      name: 'nextjsblog',
      exec_mode: 'fork',
      instances: 1,
      script: './standalone/server.js',
      env: {
        PORT: 5000,
        NODE_ENV: 'production',
        DATABASE_URL: "mysql://user1:password1@1.1.1.1:3306/database1",
      },
    },
  ],
}

next.js

相关推荐