[关闭]
@jikeytang 2023-01-16T17:05:37.000000Z 字数 6069 阅读 704

Guangzhoujs.cn - readme 上线总结

2022-blog


今天简单总结一下guangzhoujs.cn上线开发后的心得,回忆过去是为了看清未来。
先来看一下整体的效果:

1. 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的新特性用到的并不多。

2. 技术介绍

2.1 基本介绍

  1. <InfiniteScroll style={{ overflow: 'visible' }} >

2.2 技术栈

技术 说明 官网
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/

2.3 开发工具

系统 工具 官网
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/

2.4 文件结构

  1. ├─.next // 发布目录
  2. ├─server
  3. └─static
  4. ├─api // 请求文件
  5. ├─bc // 业务组件
  6. ├─components // 公共组件
  7. ├─config // 配置
  8. ├─context
  9. ├─hooks
  10. ├─icons // svg
  11. ├─layouts // 布局文件
  12. ├─pages // 页面
  13. ├─article
  14. ├─editor
  15. ├─help
  16. ├─hero
  17. ├─job
  18. └─user
  19. ├─providers
  20. ├─public // 静态资源
  21. ├─store
  22. ├─styles // 所有 Scss 文件
  23. ├─types
  24. └─utils // 工具文件

2.5 如何在本地运行

根目录下运行 npm install,然后运行 npm dev

  1. // 切换环境
  2. nvm install 17.0.0
  3. nvm use 17.0.0
  4. // 安装依赖
  5. npm install
  6. // 启动项目
  7. npm start
  8. // 清除 node_modules
  9. npm run clean
  10. // 全局安装 rimraf 之后方可使用
  11. npm i rimraf -g
  12. // 清除 node_modules 重新安装依赖
  13. // 等同于 npm run clean && npm install
  14. npm run reinstall

2.6 如何发布上线

比较大的一坑,Nextjs的开发运行目录和打包上线目录都是.next,所以,打包输出结果要仔细看,要不然会把开发时运行的文件误上传。

2.6.1 Nginx配置

先在nginx增加配置,转发nextjs的启动端口。
Nextjs虽然支持basePath进行二级目录的部署,可惜一刷新又出现basePath路径找不到的情况,只能根目录部署。

  1. location / {
  2. proxy_pass http://127.0.0.1:3600/;
  3. proxy_http_version 1.1;
  4. proxy_set_header Host $host;
  5. }
2.6.2 启动Nextjs

根目录新建ecosystem.config.js,然后用pm2启动这个文件就可以了。

  1. module.exports = {
  2. apps: [{
  3. name: 'gzjs-ssr',
  4. script: 'npm',
  5. args: 'start',
  6. cwd: '/www/wwwroot/guangzhoujs.cn',
  7. autorestart: true,
  8. watch: false,
  9. max_memory_restart: '1G',
  10. env: {
  11. NODE_ENV: 'development'
  12. },
  13. env_production: {
  14. NODE_ENV: 'production',
  15. BASE_PATH: "",
  16. PORT: 3600
  17. }
  18. }]
  19. }

然后根据域名访问,如果出现500,说明Next启动有问题,查看Nginx日志进行排错。

2.6.3 发布问题
  1. import Image from 'next/image'
  2. import Logo from '@/public/images/logo.png'
  1. generateBuildId: async () => 'v3',
  1. images: {
  2. domains: ['guangzhoujs.cn'],
  3. },
  1. $ cd /www/server/nginx/proxy_cache_dir // nginx缓存目录
  2. $ pkill nginx // 强制关闭
  3. $ /etc/init.d/nginx start // 启动
  4. $ /etc/init.d/nginx stop
  5. $ /etc/init.d/nginx restart

3. 开发介绍

3.1 基本介绍

3.2 约定式路由

约定式路由式的开发,即 pages目录下所有文件夹层级为路由访问路径。比如 pages/article/index.tsx,那访问的路径就是https://guangzhoujs.cn/article
pages中除了路由文件之外不建议放其它文件,要放其它扩展名文件还需要在next.config.js中增加配置

  1. module.exports = {
  2. pageExtensions: ['mdx', 'jsx', 'js', 'ts', 'tsx']
  3. }

3.3 基础布局

基础的布局由Layouts负责,共有这几个:

3.4 获取数据

Nextjs 共有两种渲染模式,这两个模式下有两种获取数据的方式

3.5 SEO增强

通过 next/head 组件增加页面的metakeywords, description 标签。

3.6 更新到Next.js 13

Next.js 12

  1. <title>首页 - {title}</title>

Next.js 13

  1. `<title>{`首页 - ${title}`}</title>`

Next.js 12

  1. <Link href=""><a target="_blank" rel="noreferrer">{title}</a></Link>

Next.js 13

  1. <Link href="" target="_blank" rel="noreferrer">{title}</Link>

用这个命令全局替换,然后全局校验Eslint

  1. $ npx @next/codemod new-link .

如果还想找回此文,您可以点右上角 💖Star 💖 收藏 + 支持

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注