nextjs生产环境部署node部署

233 阅读1分钟

当前项目如果在服务器直接npm run start,对资源占用很大,故需要启用node的服务,将静态资源整合后直接启动node server.js,这将大大减轻资源的占用。

在项目根目录新建build.js

调整package.json的命令

"build": "next build && node build.js",

这样打包完成之后,build.js将自动整合静态文件,并且压缩打包,发布到服务器启动node server.js即可

const fs = require('fs');
const path = require('path');
const archiver = require('archiver');

const distDir = path.join(__dirname, 'dist');
const standaloneDir = path.join(distDir, 'standalone');

if (!fs.existsSync(distDir)) {
  fs.mkdirSync(distDir, { recursive: true });
}

if (!fs.existsSync(standaloneDir)) {
  fs.mkdirSync(standaloneDir, { recursive: true });
}

function copyFiles() {
  const publicSource = path.join(__dirname, 'public');
  const publicDest = path.join(standaloneDir, 'public');;

  fs.cpSync(publicSource, publicDest, { recursive: true });
  console.log('Public folder copied to standalone directory.');

  const staticSource = path.join(distDir, 'static');
  const staticDest = path.join(standaloneDir, '/dist/static');

  fs.mkdirSync(staticDest, { recursive: true });
  fs.cpSync(staticSource, staticDest, { recursive: true });
  console.log('Static folder copied to standalone/static directory.');
}

function compressStandalone() {
  const output = fs.createWriteStream(path.join(distDir, 'standalone.zip'));
  const archive = archiver('zip', { zlib: { level: 9 } });

  output.on('close', () => {
    console.log(`Standalone folder compressed to standalone.zip (${archive.pointer()} total bytes)`);
  });

  archive.pipe(output);
  archive.directory(standaloneDir, false);
  archive.finalize();
}

copyFiles();
compressStandalone();