nextjs项目的打包、docker部署、脚本等

简书的编辑器有问题,markdown语法识别不行,可以访问原文:xinwei.ltd

这篇文章记录一下我最近写的`NextJs`项目的简单打包、部署以及一些脚本,留作记录以及供大家参考。

最近我写了一个彩票类的小程序:好彩管家(支付宝小程序)/彩号管家(微信小程序),小程序使用的taro用作跨平台的小程序开发,h5方面为了seo友好,我选择了使用`NextJs`进行改写并丰富功能,使用nextjs开发的体验还是很不错的,毕竟这么多AI公司都选择了NextJs做前端。所以我觉得广大的开发者还是应该去体验一下NextJs,还是很不错的。

话不多说,我来介绍一下我的工程。

一、工程的性能情况介绍

网页是:我的工程地址

seo检测

从这张图可以看出,我这个工程性能还是可以的,在SEO上基本比较优秀了,当然在渲染上还是有优化的空间,这里不做赘述,大家关注点可以放在如何打包部署上。

二、工程打包

下面是我的NextJs的脚本命令配置。

脚本相关

截图中已经给出了一些解释,我稍微列一下:

dev 脚本命令就是本地开发的

-p 是可选的命令,nextJs默认使用3000端口,使用-p xxx端口号,可以自定义监听的端口号

start 是生产环境下,执行这个命令就可以监听,同样可以使用-p指定端口号

deploy 是我增加的脚本命令,我在工程中写了一个bash脚本,通过npm命令就可以执行这个bash脚本,这个bash脚本就是用来打包,并上传内容到云服务器上,进行docker的相关操作。

三、我的docker-compose文件

我个人比较喜欢使用docker-compose文件来部署项目,因为文件结构清晰,配置一一对应设置就好,我这里留一下我的docker-compose文件内容。

docker文件

直接在项目根目录下创建这个文件。

```

version: '2.2'

services:

  lottery:

    image: 'node:latest'

    container_name: xxx

    working_dir: /app

    environment:

      - NODE_ENV=production

    volumes:

      - ./dist:/app

    ports:

      - 3000:3000 # 根据自己暴露的主机防火墙端口来设置

    command: >

      sh -c "npm install && NODE_ENV=production npm run start"

```

这个文件比较简单,就指定了一个容器的配置,使用node镜像,然后容器启动时,会执行command脚本中的命令。

四、bash脚本

bash脚本的作用就是用来执行npm相关命令删除旧打包产物、生成新产物,然后通过云服务器的scp授权证书远程ssh访问,操作云服务器文件、文件夹、docker等。

bash脚本内容:

```

#bin/sh

echo "当前路径:"

echo ""

pwd

echo "删除旧产物"

rm -rf .next

echo "打包项目,生成新产物"

npm run build

echo "加权限"

chmod 777 .next

# 这是在云服务器厂商管理后台生成的ssh操作授权证书,可以放在本地电脑上,执行命令时带入即可操作云服务器资源

SSH_KEY="/Users/hamry/xxx/ssh_visit.pem"

# 这是主机访问的username和IP,这里不是我的实际IP,你需要改成你自己云服务器的ip地址

SERVER="root@1.2.3.4"

echo "连接服务器&删除旧产物"

ssh -i $SSH_KEY $SERVER '

echo "当前目录:";

pwd;

echo "删除旧产物";

rm -rf /root/lottery_nextjs/dist/*;

rm -rf /root/lottery_nextjs/dist/.[^.]*;

'

echo "拷贝产物到服务器"

echo "拷贝 .next、package、package-lock、public 到服务器"

scp -q -i $SSH_KEY -r .next package.json package-lock.json public $SERVER:/root/lottery_nextjs/dist/

echo "拷贝 docker-compose 到服务器"

scp -q -i $SSH_KEY docker-compose.yml $SERVER:/root/lottery_nextjs/

echo "重启docker"

ssh -i $SSH_KEY $SERVER '

pwd;

cd /root/lottery_nextjs/dist;

pwd;

# docker-compose up  # 这里是第一次执行脚本时,会创建docker容器,第二次不用再次执行,不然每次都覆盖生成新容器。

docker restart xxx  # 和上面的命令不要同时执行,第一次生成容器时不要执行这个命令,第二次后就可以注释上面的命令,使用这条命令来重启第一次生成的那个容器ID

'

echo "容器重启成功"

```

脚本的相关内容,我都在上面做了解释,大家如果要参考,要仔细阅读清楚,避免执行出错。

另外,这里要说明一下,我们不需要把整个NextJs工程拷贝到云服务器,很占据云服务器空间的,所以我们只需要把重要关键的文件传输到云服务器。关键的文件在上面的脚本中已经有处理,我罗列在这里:

.next文件夹,这个是dev或者build时都会生成的隐藏文件夹,产物都放在这里了

package.json & package-lock.json,这2个文件也必不可少,最终执行命令也要通过npm run start执行package.json中的start命令。

public 文件夹,这里存放的是工程的静态资源文件,也是必不可少的,否则静态资源的访问就会出现404.

这里要说一句为什么没有node_modules文件夹呢,是不是很奇怪,那说明你可能没看懂docker-compose.yml脚本中的那行命令:

```

...

command: >

      sh -c "npm install && NODE_ENV=production npm run start"

...

```

这次看清楚了吧,这里有npm install命令,因为是node镜像,然后有package.json,那么在云服务器上安装依赖就很容易。如果要自己上传node_modules文件夹,一个是上传时间会特别久,另一个原因是有可能终端命令行执行由于文件太多导致EOF问题失败。

五、云服务器上的文件内容

5.1 整体文件夹

服务器上文件结构

这里我在云服务器上创建了一个文件夹:lottery_nextjs,我所有的项目都会在云服务器的根路径/root目录下,lottery_nextjs这个文件夹就是我用来部署这个项目的专属文件夹。

这个文件夹下面,放了2个东西:

dist:用于存放nextjs工程的打包产物,bash脚本中上传的内容都是到dist文件夹下;

docker-compose.yml: docker-compose文件,这个是用来创建docker容器,并让docker启动nextJs服务的,内容在上面已经给大家显示出来了。

5.2 dist文件夹

云服务器文件结构

大家看到了吧,上面提到的4个文件/文件夹,就是上传到这里,如果你没看到.next文件夹,因为那是隐藏文件夹,你要点击截图中的红色框部分,可以查看隐藏内容。

这里的node_modules就是通过npm install生成的。

六、图片

另外我展示一下next.config.ts中的图片配置,因为网络图片访问是需要进行域名配置的,在dev环境下访问没有问题,但是生产环境的安全策略必须要配置图片访问域名,如下:

工程配置

```

import type { NextConfig } from 'next';

const nextConfig: NextConfig = {

  /* config options here */

  images: {

    remotePatterns: [

      {

        protocol: 'https', // 协议:http/https

        hostname: 'baidu.com', // 域名

        port: '', // 端口(无则留空)

      },

    ],

  },

  output: 'standalone',

};

export default nextConfig;

```

这里建议设置:output: 'standalone',,是优化docker部署的,大家可以试试。

七、其他

大家正常开发完项目后,通过我上述的操作,你可以很快的把nextjs项目部署到自己的服务器上,我这里是为了快速上线,所以怎么快怎么来。如果要更正式点,那么就需要使用工具做一些持续集成了,大家自己可以去摸索一下。

以上。

求关注。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容