5分钟入门 next13

上半年vercel 推出了nextjs13 这个大版本,刚好最近有个c端的项目,所以就用了这个框架来写,技术体系基本也是文档提到的 tailwindcss + ts + swr + ssr ,总的来开发体验还可以,不管是打包速度、文档、错误信息提示目前都还满意,只不过目前nextjs13 中文资料有点少,不过问题也不大。
之所以只要5分钟就可以入门,是因为我觉得nextjs官网文档写的挺好的,我之前也没有用过nextjs,看文档之后,上手写东西也很快。https://nextjs.org/
文件路由系统
next13 使用文件约定路由,这样就不需要配置 path 与组件的之间的映射关系了。
每一层路由必须建一个文件夹,在该文件夹中建立 page.tsx 作为该路由主页面 如 域名是:http://baidu.com,页面路径是demo,文件结构如下
app
demo
page.tsx
loyout.tsx
比如在目前这个项目中没有授权的页面路径是 /noAuth ,对应的代码结构就是在跟目录下建一个noAuth 文件夹,文件夹中新建一个 page.tsx 即可即可。

通过上面,我们知道app 内文件夹会被当作路由结构来解析,如果要自己的文件夹,可以下划线开头的命名,如

通常我们会在这种文件夹中放一些业务组件或者公共组件。
app 路由模式
next13 默认是app 路由模式,这个模式下我们可以建立一些固定名称的组件,layout、template、page [jx、jsx、ts、tsx],这些固定名称的组件有不一样的作用, page.tsx 就是我们该模块下的首页。
layout.tsx该路由下的公共导航,切换路由时,不会刷新,类似模版页,page.txs 就是layout 页面中的 childrentemplate.tsx该路由下的公共部分,切换路由时,会刷新page.tsx该路由的主页面

layout.tsx 类似模版页,有了这个模版页面,我们可以很方便的编写统一的布局、样式,以及可以利用layout 嵌套来实现子模块个性的布局。
服务端组件
在Next13中,app目录下的组件默认都是服务端组件,在服务器中渲染好dom节点再返回到浏览器(默认没有交互)。
有了服务端组件,我们可以在React应用中用同一套React语法,混合使用服务端组件和客户端组件。
如果需要转换成客户端组件,只需要在文件的开头使用 use clinet 即可。
服务端组件几个比较特别的好处
- 在服务端组件中发起请求,可以在请求返回HTML前,就完成数据的读取。相比原来JS应用从服务端传送JS资源到客户端,React完成渲染后再向服务端请求数据,大幅减少FCP(首次内容绘制时间)。
- 有效减少传送到浏览器的JS包体积。
- 传统SSR的各种优势(SEO友好,首屏渲染快)。
服务器和客户端组件可以组合在同一组件树中,并且他们可以混合使用,通常客户端组件最好在组件树中的叶子节点位置(有交互的组件)。

理论上在nextjs中,服务端、客户端组件应该像上面图那样来划分,外层容器、以及列表数据的获取用服务端组件、交互部分小的组件用客户端组件,这样效率应该不错。
目前服务端组件、客户端组件数据同步的方式还不是太好,目前我只知道通过在服务端组件使用props 的方式。
如果可以做到在客户端组件通过什么东西直接拿,然后数据又是实时同步,类似在服务端组件、客户端组件都能拿到想要的数据状态,且数据保持一致。
服务端组件渲染策略:
- 静态渲染
- 动态渲染
- 流式渲染
其他的也貌似没什么写的,还是多看看官方文档比较好,https://nextjs.org/docs
遇到的问题
nest13 globalThis is not defined

解决方案:一开始我以为我安装了 globalthis 模块,然后在根 layout 中引入即可。信心满满的打包,部署,然后发现还是报错。

后面在github的issues 中发现要用Script 组件引入,然后我改成下面这种就可以了。

配置多个环境,打包不同的环境变量
我们部署的时候有测试环境,预生产、灰度、生产等多个环境,不同的环境,有些配置是不一样 如url、或者其他的配置。
一开始我看到文档说 NODE_ENV === development 环境,加载的是.env.development,同理 production 加载的是.env.production,那么我只要设置NODE_ENV 在不同环境下是不同的值即可。
但是经过测试,我发现 只要是 build 的命令,next的环境变量 NODE_ENV 一直都是production,覆盖不了,所以这种方式行不通,只能在增加一个环境变量来区分。
所以还是只能通过老办法,通过cross-env 传递变量,然后在 next 的配置文件中写入到nextjs 中,在通过 process.env.xx 使用即可。
"scripts": {
"dev": " cross-env BUILD_ENV=test next dev -p 3001",
"build:test": "cross-env BUILD_ENV=test next build",
"build:pre": "cross-env BUILD_ENV=pre next build",
"start": "next start -p 3001",
"lint": "next lint"
},
// 配置文件中在写入
env: {
BUILD_ENV: process.env.BUILD_ENV || "test",
buildTime: new Date().toLocaleString()
},
// 使用
console.log("当前环境", process.env.NODE_ENV);
console.log("环境变量:", process.env.BUILD_ENV);
console.log("打包时间:", process.env.buildTime);
小结
- nextjs13 是一个全栈的开发框架、也提供了一些常用的组件
- 服务端组件、客户端组件混合使用、以及服务端组件渲染策略
- app 路由的 page、layout、loading 等固定的组件名称
- tailwindcss 、swr 还挺好用的
5分钟入门 next13的更多相关文章
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Objective-C 30分钟入门教程
Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...
- Apache Shiro系列三,概述 —— 10分钟入门
一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...
- JavaScript 10分钟入门
JavaScript 10分钟入门 随着公司内部技术分享(JS进阶)投票的失利,先译一篇不错的JS入门博文,方便不太了解JS的童鞋快速学习和掌握这门神奇的语言. 以下为译文,原文地址:http://w ...
- 十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))
十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的 ...
- 30分钟入门Java8之方法引用
30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method Referenc ...
- 30分钟入门Java8之默认方法和静态接口方法
30分钟入门Java8之默认方法和静态接口方法 前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方 ...
- 【原创】30分钟入门 github
很久没更新了,这篇文章重点在github的入门使用,读者可以下载github for windows shell,边看边操作,加深印象. 好了,30分钟的愉快之旅开始吧: 一.github使用的注意事 ...
- 正则表达式30分钟入门教程<转载>
来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial. 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了 ...
- kafka原理和实践(一)原理:10分钟入门
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
随机推荐
- 信息收集_网络扫描_nmap
信息收集_网络扫描nmap 目标说明 -iL <inputname> (从列表或文件输入) -iR <hostnum> (随机选择生成目标数量) --exclude <h ...
- AI 协助办公 |记一次用 GPT-4 写一个消息同步 App
GPT-4 最近风头正劲,作为 NebulaGraph 的研发人员的我自然是跟进新技术步伐.恰好,现在有一个将 Slack channel 消息同步到其他 IM 的需求,看看 GPT-4 能不能帮我完 ...
- P8933 [JRKSJ R7] 技巧性的块速递推 题解
题目传送门 题意: 简单来说就是一个涂色游戏. 有一个 n×m 的棋盘需要涂色. 每格只能涂黑色或白色两种颜色. 横.竖.斜连续 3 格颜色不能相同. 横.竖.斜连续 4 格颜色不能有 3 个相同颜色 ...
- mybatis-plus是什么框架,使用起来简单吗?文末有彩蛋
mybatis框架我们都熟悉了,是用来操作数据库的属于ORM框架.mybatis-plus是什么框架,看名称和手机似的,带有plus一定是加强版,其官网是:MyBatis-Plus (baomidou ...
- 解决MySQL自动弹出命令行窗口
自从装了MySQL之后,我的电脑就会在某些时刻弹出一个黑乎乎的命令行窗口,然后立马消失.一开始还以为是电脑出了什么故障,但一直没有出现其他什么问题,就是玩游戏时弹出来有点难受.有一次我眼睛看到了一闪而 ...
- C++面试八股文:了解auto关键字吗?
某日二师兄参加XXX科技公司的C++工程师开发岗位第15面: 面试官:了解auto关键字吗? 二师兄:嗯,了解一些(我很熟悉). 面试官:说一说auto的用法吧? 二师兄:auto主要是为了编译器进行 ...
- MyBatis-plus乐观锁
什么是乐观锁呢?为什么要使用这个功能?这个功能能做什么呢?如何使用这个? 1.乐观锁( Optimistic Locking ) 是相对悲观锁而言的,乐观锁是假设认为数据一般情况下不会造成冲突,所以在 ...
- 补充 6-13 《关于SQL SERVER 字段类型char(n) , nchar(n) , varchar(n) , nvarchar(n)》
今天补充一下<关于SQL SERVER 字段类型char(n) , nchar(n) , varchar(n) , nvarchar(n)>类型的区别 虽然两个字符串一样,但是定义的类型不 ...
- 【go语言】2.1.1 变量,常量和数据类型
Go 语言中,变量是存储数据的基本单位,常量则是固定不变的数据.每个变量和常量都有其对应的数据类型. 变量 在 Go 语言中,你可以使用 var 关键字来声明一个变量: var name string ...
- python下的jstack - pystack
背景 python 多进程任务,卡在某个地方没有继续执行也没有报出异常,进程被hang住 日志没有捕获到相关信息,需要知道进程阻塞在哪里,为什么阻塞 jvm提供了jstack.jmap类工具进行性能分 ...