node打包单体文件部署服务器

本文介绍了如何使用ncc工具将Node.js项目打包成单个文件,并详细讲述了Nginx在本地服务器的部署步骤,包括路径配置、端口设置、服务重启以及日志排查等关键环节,强调了正确管理和关闭Nginx服务以避免出现缓冲问题的重要性。

1.使用的ncc进行打包node.js 文件 

2.使用的命令如下:

npm i -g @vercel/ncc
ncc build input.js -m -o dist 只需要输入这俩行命令就可以打包完成。
npx ncc build index.js -m -o ./dist  服务器指令
-m #混淆、压缩代码
-o #指定输出目录
打包完毕之后会在当前工程目录中,创建一个dist文件夹,存放打包后的文件index.js

还可以这样打包
// 全局安装pkg
npm install -g pkg

// 进入你的项目目录
cd project

// 执行打包exe文件,其中start.js就是你的入口文件
pkg -t win start.js

// 如果你需要支持win/linux/mac多个平台的话,就执行这一句
pkg start.js


GitHub - vercel/ncc: Compile a Node.js project into a single file. Supports TypeScript, binary addons, dynamic requires.

ncc build 入口文件 -o ./dist   -o代表打包的文件夹 ./dist输出的目录为dist

niginx部署在本地的服务器上需要把路径一定放对 否则会出现各种问题。以及代理的端口一定配置好。在重新启动前niginx一定要求任务管理器把之前的强制关掉,否则会启动多个niginx服务。

如果niginx不把之前关掉,会产生一下缓冲,当你访问的时候还是之前的niginx并没有显示的是最新的niginx服务。然后一旦出现问题先找niginx服务中的日志信息。每次关掉niginx的时候一定需要吧日志清除一下。否则排查错误无法排查。

自己手写一个打包node项目的脚本已测试:

import cmd from "shelljs";
import fs  from "fs";
import path from "path";
getState(path.resolve());
/**
 * 获取当前路径下的文件
 */
async function getState(paths) {
  let data = await fs.readdirSync(paths);
  for (let pop of data) {
    if (pop == "build.js") {
      continue;
    }
    if (pop == "video") {
      continue;
    }
    if (pop == "dist") {
      continue;
    }
    if (pop == ".history") {
        continue;
      }
    if (pop == "node_modules") {
      continue;
    }

    if (pop.split(".")[1] == "js") {
      await runcmd(path.join(paths, `/${pop}`), paths + "/dist");
      await fs.renameSync(paths + "/dist/index.js", paths + "/dist/" + pop);
      continue;
    }
    if (pop.split(".")[1] == "json") {
      let ReadStream = fs.createReadStream(path.join(paths, pop));
      let writeStrem = fs.createWriteStream(path.join(paths, "./dist/" + pop));
      ReadStream.pipe(writeStrem);
      continue;
    }
    console.log(paths + "/" + pop);
    createsraferFilder(paths + '/' + pop, pop)
  }
     /**
      * readFileSync 读取文件
      */
  let json = await fs.readFileSync(path.join(path.resolve(), "./package.json"));
  let packages = JSON.parse(json.toString());
  delete packages["type"];
  await fs.writeFileSync(
    path.join(path.resolve(), "./dist/package.json"),
    JSON.stringify(packages)
  );
  try {
    let dirs = await fs.statSync((path.resolve(), "./dist/video"));
  } catch (e) {
    await fs.mkdirSync((path.resolve(), "./dist/video"));
  }
}
/**
 * 执行cmd
 */
function runcmd(path, dir) {
    console.log(`ncc build ${path} -m -o ${dir} `)
  return nodeCmd(`ncc build ${path} -m -o ${dir} `);
}
/**
 * 执行cmd
 */
function nodeCmd(str) {
  return new Promise((req, res) => {
    cmd.exec(str, function (code, stdout, stderr) {
      if (code === 0) {
        req();
      }
    });
  });
}
/**
 * 创建文件夹
 */
async function createsraferFilder(paths, props) {
  let dir = await fs.statSync(paths);
  if (dir.isDirectory()) {
    try {
      let dirs = await fs.statSync(path.join(paths, "../dist/" + props));
    } catch (e) {
      await fs.mkdirSync(path.join(paths, "../dist/" + props));
    }
    let data = await fs.readdirSync(paths);
    for (let pop of data) {
      if (pop.split(".")[1] == "js") {
        console.log(
          path.join(paths, `/${pop}`),
          path.join(paths, `../dist/${props}/`)
        );
        await runcmd(
          path.join(paths, `/${pop}`),
          path.join(paths, `../dist/${props}/`)
        );
        await fs.renameSync(
          path.join(paths, `../dist/${props}/index.js`),
          path.join(paths, "../dist/" + props + "/" + pop)
        );
      }
      if (pop.split(".")[1] == "json") {
        let ReadStream = fs.createReadStream(path.join(paths, "/" + pop));
        let writeStrem = fs.createWriteStream(
          path.join(paths, "../dist/" + props + "/" + pop)
        );
        ReadStream.pipe(writeStrem);
      }
    }
  }
}

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
   server {
        listen       8080;
        server_name  localhost;
        charset utf-8;

        location / {
            root E:/bgwl/nginx/nginx-1.22.1/nginx-1.22.1/dist/;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
       location /api/ {
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header REMOTE-HOST $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
   
           proxy_set_header X-NginX-Proxy true;
           proxy_pass http://ip:xxx/;

        }
      
        location /prod-api/ {
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header REMOTE-HOST $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
   
           proxy_set_header X-NginX-Proxy true;
           proxy_pass http://192.168.1.11:9800/;

        }
       location /zfMapRoad/ {
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header REMOTE-HOST $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
   
           proxy_set_header X-NginX-Proxy true;
           proxy_pass http://192.168.1.11:9800/;

        }
	location  /view/ {
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header REMOTE-HOST $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
   
           proxy_set_header X-NginX-Proxy true;
           proxy_pass http://192.168.1.11:9800/view/;

        }
        
        location  /recorder/ {
           proxy_set_header Host $http_host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header REMOTE-HOST $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
   
           proxy_set_header X-NginX-Proxy true;
           proxy_pass http://192.168.1.11:9800/recorder/;

        }
}

          server {
           listen 9003;
           server_name localhost;
           charset utf-8;
           location /cesiumlab {
                alias E:/bgwl/nginx/nginx-1.22.1/nginx-1.22.1/nantong-tms/nantong-tms/;
                index  tilemapresource.xml;
           }
       
    } 
    
}
















评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值