@jikeytang
2023-01-16T09:05:37.000000Z
字数 6069
阅读 1008
2022-blog
今天简单总结一下guangzhoujs.cn上线开发后的心得,回忆过去是为了看清未来。
先来看一下整体的效果:
guangzhoujs.cn 定位服务于广州本地前端相关知识信息综合性交流平台,是基于当下流行的Nextjs, Go相关技术框架下的产物,在这个大前提下,技术融合和功能实现上更为灵活。Nextjs在使用React开发的基础上满足了SEO的需要,Go在保证响应速度的基础上占用最低的系统资源。
结果虽然很美丽,但过程很漫长,一个成功上线项目的背后是两个失败仓库的奠基,技术的选型有从最初的nuxt3.rc1开始,到中期更新到rc10之后就跑不起来的失败,也有被迫转向Nextjs.12的无耐。而Nextjs在开发快要完成的节骨眼上新版本13发布,又是一波骚操作,从Nextjs12强性升级到Nextjs13版本,Next.js 13 虽然包含了 Turbopack,但目前还是Alpha阶段,最后衡量再三还是没有启用新的Turopack,还是奔着需求做加法、开发做减法的原则先上线再优化。那这个版本只是让12的代码在13的版本下正常运行起来,Next13的新特性用到的并不多。

Nextjs
Nextjs的项目整体开发下来,除了上线遇到点坑之外,其它方面只要会React Hooks基础的文档看看都能开发。那刚发新版中文文档是没有的,然后我用这款翻译软件辅助:腾讯交互翻译。Nuxtjs中文站点入口。
Tailwindcss
本来我迷恋于Unocss的灵活,可惜在Nextjs中热更新老是失去响应,只能换回Tailwindcss,虽然Unocss也提供了一个Nextjs下的案例。
Antd
Antd选择的4.x版本,这个版本遇到的问题是分页组件在Next下跳转失效,所以就翻页又引入了另外一个UI组件库:@nextui-org/react,只是这款组件视觉风格上我个人感觉较Antd略为粗犷,所以只使用了分页。
Icon
项目中的图标除了@ant-design/icons之外,本着图标风格上有更多的选择,所以引入了@carbon/icons-react,整体用下来基本满足基础的图标需要。
富文本编辑器
针对不同用户的使用习惯分别提供了两款输入编辑器,一款供非专业人士使用,比如Hr。一款供专业人士使用,比如会Markdown语法的小伙伴,他们分别是:
api-key,需要说明的是只申请一个api-key,然后可使用在多域名场景下,只需要在tiny官网添加即可,登录之后在 MY ACCOUNT / Approved Domains 中添加,申请也是这个地址。node_modules\juejin-markdown-themes\dist 目录下。qrcode.react
其中一个页面需要分享展示用到二维码,用的这款,按照文档使用起来也没有大的问题。
react-copy-to-clipboard
按钮复制用这款,也没有什么大的问题。
react-infinite-scroll-component
滚动加载用到了这款,出现的问题是出现滚动条,添加样式强制显示即可隐藏滚动条。
<InfiniteScroll style={{ overflow: 'visible' }} >
| 技术 | 说明 | 官网 |
|---|---|---|
| Nextjs | React应用开发框架 | https://nextjs.org/ |
| Mobx | 全局状态管理模式 | https://mobx.js.org/ |
| Mobx-react-lite | mobx-react的轻量化版本 | https://github.com/mobxjs/mobx-react-lite |
| Axios | HTTP 库 | https://github.com/axios/axios |
| Ant-design | UI组件库 | https://ant-design.gitee.io/ |
| Nextui | UI组件库 | https://nextui.org/ |
| Ahooks | React Hooks 库 | https://ahooks.js.org/ |
| Bytemd | Markdown编辑器 | https://github.com/bytedance/bytemd |
| Tinymce | 富文本编辑器 | https://www.tiny.cloud/ |
| Dayjs | JavaScript 日期处理类库 | https://day.js.org/zh-CN/ |
| SCSS | CSS预处理器 | https://sass-lang.com/ |
| Carbon | 图标字体库 | https://carbondesignsystem.com/guidelines/icons/library/ |
| Qrcode | 二维码 | https://github.com/zpao/qrcode.react |
| React-copy-to-clipboard | 复制 | https://github.com/nkbt/react-copy-to-clipboard |
| React-infinite-scroll-component | 滚动加载 | https://github.com/ankeetmaini/react-infinite-scroll-component |
| Tailwindcss | 原子CSS库 | https://tailwindcss.com/docs/guides/nextjs |
| Juejin-markdown-themes | 掘金 Markdown 主题 | https://github.com/xitu/juejin-markdown-themes |
| Typescript | 类型约束 | https://www.typescriptlang.org/ |
| 系统 | 工具 | 官网 |
|---|---|---|
| VScode | 主开发工具 | https://code.visualstudio.com/ |
| Webstorm | 辅开发工具 | https://www.jetbrains.com/webstorm/ |
| Atom | 源码阅读 | https://atom.io/ |
| Cmder | Cmd替代工具[windows] | https://cmder.net/ |
| Notepad2 | 单文件编辑[windows] | http://www.flos-freeware.ch/notepad2.html |
| Coteditor | 单文件编辑[mac] | https://coteditor.com/ |
| Chrome | 调试工具 | https://www.google.com/intl/zh-CN/chrome/ |
├─.next // 发布目录│ ├─server│ └─static├─api // 请求文件├─bc // 业务组件├─components // 公共组件├─config // 配置├─context├─hooks├─icons // svg├─layouts // 布局文件├─pages // 页面│ ├─article│ ├─editor│ ├─help│ ├─hero│ ├─job│ └─user├─providers├─public // 静态资源├─store├─styles // 所有 Scss 文件├─types└─utils // 工具文件
根目录下运行 npm install,然后运行 npm dev
// 切换环境nvm install 17.0.0nvm use 17.0.0// 安装依赖npm install// 启动项目npm start// 清除 node_modulesnpm run clean// 全局安装 rimraf 之后方可使用npm i rimraf -g// 清除 node_modules 重新安装依赖// 等同于 npm run clean && npm installnpm run reinstall
比较大的一坑,Nextjs的开发运行目录和打包上线目录都是.next,所以,打包输出结果要仔细看,要不然会把开发时运行的文件误上传。
先在nginx增加配置,转发nextjs的启动端口。
Nextjs虽然支持basePath进行二级目录的部署,可惜一刷新又出现basePath路径找不到的情况,只能根目录部署。
location / {proxy_pass http://127.0.0.1:3600/;proxy_http_version 1.1;proxy_set_header Host $host;}
根目录新建ecosystem.config.js,然后用pm2启动这个文件就可以了。
module.exports = {apps: [{name: 'gzjs-ssr',script: 'npm',args: 'start',cwd: '/www/wwwroot/guangzhoujs.cn',autorestart: true,watch: false,max_memory_restart: '1G',env: {NODE_ENV: 'development'},env_production: {NODE_ENV: 'production',BASE_PATH: "",PORT: 3600}}]}
然后根据域名访问,如果出现500,说明Next启动有问题,查看Nginx日志进行排错。
url-loader也不能解决,解决办法,转换为Base64图片,后看文档也可以用Image,未试存疑中。
import Image from 'next/image'import Logo from '@/public/images/logo.png'
/.next/static下,可以手工修改也可以是Git commit id。
generateBuildId: async () => 'v3',
images: {domains: ['guangzhoujs.cn'],},
package.json到根目录然后在服务端全量安装node_modules
$ cd /www/server/nginx/proxy_cache_dir // nginx缓存目录$ pkill nginx // 强制关闭$ /etc/init.d/nginx start // 启动$ /etc/init.d/nginx stop$ /etc/init.d/nginx restart
基础的工程采用Pnpm Monorepo的方式来搭建,在满足基础开发的需求上能够灵活扩展模块,并保持代码解耦。这方面其它大佬已经走在前面:
由于整体是React的相关技术栈,计划帮助文档部分由dumi来实现,可以快速的将Markdown转化为页面,入口地址由Nginx来安排。
约定式路由式的开发,即 pages目录下所有文件夹层级为路由访问路径。比如 pages/article/index.tsx,那访问的路径就是https://guangzhoujs.cn/article。
pages中除了路由文件之外不建议放其它文件,要放其它扩展名文件还需要在next.config.js中增加配置。
module.exports = {pageExtensions: ['mdx', 'jsx', 'js', 'ts', 'tsx']}
基础的布局由Layouts负责,共有这几个:
Nextjs 共有两种渲染模式,这两个模式下有两种获取数据的方式
getStaticProps 静态模式下使用,在构建时会调用该函数获取数据并返回到 props,会在构建时渲染生成 htmlgetStaticProps 中的 context 参数包含了常用的请求的 params,preview,previewData,locale 等参数服务器端渲染模式,即每次请求时在服务器端重新生成 html。
getServerSideProps 服务器端渲染模式下使用,会在每次请求时先获取数据,接着重新生成 html 后再将页面返回到客户端。getServerSideProps 中的 context 参数包含了常用的请求的 req、res、params、query 等参数axios
页面上在useEffect中异步获取数据,这块的代码意思是在浏览器端运行了。
通过 next/head 组件增加页面的meta 的 keywords, description 标签。
Next.js 12
<title>首页 - {title}</title>
Next.js 13
`<title>{`首页 - ${title}`}</title>`
Next.js 12
<Link href=""><a target="_blank" rel="noreferrer">{title}</a></Link>
Next.js 13
<Link href="" target="_blank" rel="noreferrer">{title}</Link>
用这个命令全局替换,然后全局校验Eslint
$ npx @next/codemod new-link .
如果还想找回此文,您可以点右上角 💖Star 💖 收藏 + 支持