xzgz.top网站实录主要技术栈应用主要由koa构建,其中nextjs只负责页面构建和服务端渲染。以下是主要应用的技术背景koa:网站主题内容koa-router:网站后端路由koa-session:应用会话写入nodemailer:发送邮件mysql2:数据库操作nodemon:开发模式热更新typescriptts-node:完整开发在模式下运行ts文件tsconfig-paths:修复开发模式下tsconfig.json中的路径映射在ts-node下不起作用。前台Nextjs:React服务端渲染mobx:前端应用全局状态管理Sass:前端应用风格githubapi:完成笔记存储,以及markdown文件转html功能部署使用github的webhook进行自动部署。触发webhook后,执行shell脚本,自动拉取代码,dockerbuild,运行应用。#!bin/shexitError(){echo"---starting$1---"$1if[$?-eq0];然后echo"---$1successfully---"elseecho"!!!!!!!!!!$1error!!!!!!!!!"exit0fi}echo"===========开始重建==========="cd/root/xzgzexitError"gitpull"exitError"dockerbuild-txzgz_i."dockerrm-fxzgz_idocker停止xzgz_cdockerrm-fxzgz_cexitError"dockerrun-d-p3000:3000--namexzgz_cxzgz_i"echo"==========endrebuild=========="遇到的一些问题tsconfig.json中的路径映射问题开发模式下:vscode读取tsconfig.json中的路径映射没有问题,引用不会报错,但是ts-node启动脚本时,路径映射会丢失。解决方法是使用tsconfig-paths:#使用如下命令打开脚本npxts-node-rtsconfig-paths/register--project./tsconfig.jsonapp_server/index.ts在nodemon的配置文件nodemon中设置。json{"watch":["app_server/","types/"],"ext":"js,json,ts","execMap":{"ts":"ts-node-rtsconfig-paths/register--项目./tsconfig.json"}}生产模式:直接使用ts-node启动服务器不适合生产模式,使用tsc将ts文件编译成js文件,运行tsc--projecttsconfig.prod.json生成的文件执行和上面一样的问题,因为编译tsc的时候不会编译路径映射,直接执行会报找不到模块的错误,按照tsconfig-paths/register的解决方法,重写Module.\_resolveFilename在运行脚本之前解决路径映射问题。具体代码:constModule=require("module");constpath=require("path");//具体路径映射根据实际情况更改constreplaceUrl=/^@server\//;functionfindModel(request,_module){constpathArr=request.replace(replaceUrl,"");让我=_module;while(i){constfilename=path.resolve(i.path,"../");if(/app_server$/.test(filename)){break;}else{i=_module.parent;}}returnpath.join(i.path,"../",pathArr);}functionpreRunApp(){varoriginalResolveFilename=Module._resolveFilename;Module._resolveFilename=function(request,_parent){if(replaceUrl.test(request)){constfindModule=findModel(request,_parent);returnoriginalResolveFilename.call(this,findModule);}returnoriginalResolveFilename.call(this,request,_parent);};}preRunApp();然后在执行脚本时使用命令node-r./preRunApp.jsdist/app_server/index.js,使用nodemailer发送163邮箱时超时问题,主要是因为使用163邮箱发送邮件必须开启secure:transporter=nodemailer.createTransport({host:"smtp.163.com",//第三方邮箱主机地址port:465,//25/465,securetrue-465;false-25secure:true,//163邮箱必须为true,outlook邮箱必须为falseauth:{user:SENDER,//发件人邮箱账号pass:SMTP_CODE,//邮箱授权密码},});生产环境请求的时间数据与开发环境请求的相同数据不一致(docker容器与系统时区不一致)。应用运行在docker容器中,docker容器的日期与系统不一致。在Dockerfile中配置将系统使用的时区复制到docker容器中,具体如下:RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtimeRUNecho'Asia/Shanghai'>/etc/timezone生产环境请求接口页面会报错,提示水化失败,而开发环境没有这个问题这个问题也受上面的问题影响。docker容器中react脱水执行的构建时间的太平洋时间。到了客户端注水时间,生成了东8区的时间,导致服务端和客户端渲染不一致,所以报错。在nextjs中使用mobxserver和client的数据是不能保持一致的,因为mobx在server初始化时产生的数据并没有传给client,所以client需要完成一次初始化。有些页面需要提前调用store中的方法来完成服务端渲染。然后需要手动完成mobx的注水过程(类似于服务端渲染的脱水注水)。使用如下方法解决://pages/_app.tsfunctionMyApp({Component,pageProps,store,//重点}:AppProps&{store:AppStore}){//注水const_defaultStore=initializeStore(store);返回(
