Next.js 上
Next.js 上
Next.js的背景
开发团队是zeit
zeit团队水平如何?看看这篇知乎上的答案https://www.zhihu.com/question/59278159/answer/813629215
后来团队改名为Vercel。
简而言之,一个高中开始编程的,会做平面设计的复旦大学计算机专业毕业生,在微软工作过一年后,加入了zeit团队。
几乎每一个同事都有非常强大的背景.
Next.js核心团队四个人平均年龄20岁
按star数,zeit是Github组织的Top20
全员远程工作
Next.js的定位
Next.js不是一个前端框架也不是一个后端框架,而是一个全栈框架,即有了这个框架前后端的事情它都能做。比如
CSS-in-JS
页面预渲染+SSR(服务端渲染)
前后端同构(代码同时运行在两端)
Node.js版本在10.13以上
支持React和TypeScript
弱项
完全没有提供数据库相关功能,可自行搭配Sequelize或TypeORM
完全没有提供测试相关功能,可自行搭配Jest或Cypress
有一个叫做Blitz.js的框架在这些方向上努力
谁在用Next.js
国内
腾讯网手机版,和Teambition
国外
Netflix Jobs, Twitch手机版,Hulu,TikTok抖音海外版,漫威官网,Material UI官网
总结
国外用的比较多,国内用得少,那么国内学这个好找工作吗
学Next.js好找工作吗
方方的思考
国内一般招聘偏后端的前端,这样企业就可以省去招一个纯后端,国内市面上纯Node后端的需求和前端的比的话要少很多很多,可以去拉勾网上看。
Next.js切合了SSR,Serverless等技术热点。
支付宝的Umi是一个类Next.js框架,说明被认可
Next.js背后的团队方方非常欣赏。
饥人谷已经教了express和koa,完全可以自行掌握egg.js
综上
进可往技术热点靠,退可回到egg.js
Next.js全解
一节课搞清核心技术
使用Next.js做博客系统
官方教程
官网入门教程就是做博客系统(饥人谷的教程略有删改)
需求
我们对博客系统的需求足够了解,不需要再讨论
难易程度
非常简单,易于学习
创建项目
命令
2023年更新:
用以下代码创建博客示例
我用的是Mac Mini,实际安装的时候和方方上课演示的略有出入
用浏览器打开控制台给出的网址,默认是http://localhost:3000

CRM学习法,将贯穿整个学习过程
CRM
改内容
把welcome to 改成Hello
加页面
创建pages/posts/first-post.js
如何访问这个页面?
路径为/posts/first-post
⚠️如果无法访问的话直接重启服务即可
新的版本是把页面放在pages的文件夹下,任何创建的页面都可以显示
比如pages/first-post.js, 在localhost:3000/first-post就可以显示。
如果要创建/authors/me,应该放在pages/authors/me.js下,并且一定要export,这样页面就可以显示出来。
总结
Nextjs的理念借鉴了Rails的理念,约定大于配置,不需要配置,只需要约定,开发者自然意会
Link快速导航
官方教程在此
用法
把<a href=xxx>点击跳转</a>改成
<Link href=xxx><a>点击跳转</a></Link>
优点
为什么要用Link?
页面不会刷新,用AJAX请求新页面内容
不会请求重复的HTML、CSS、JS
自动在页面插入新内容、删除旧内容
因为省了很多请求和解析过程,所以速度极快

Link快速导航借鉴了Rails Turbolinks,pjax等技术
同构代码
同构代码的意思就是你的代码会同时在浏览器和NodeJs运行
代码运行在两端
在组件里写一句console.log("执行了")
你会发现Node控制台会输出这句话
你会发现Chrome控制台也会输出这句话
注意差异
不是所有的代码都会运行,有些需要用户触发,比如onClick
不是所有的API都能用,比如window在Node里报错,因为window只在浏览器里支持,并不在Node里支持,运行在两端必须两边都支持。
小结
创建项目
npm init next-app 项目名
快速导航
包住同构代码一份代码,两端运行(省了一份)全局配置
官方教程:https://nextjs.org/learn/basics/assets-metadata-css
自定义
全局CSS
局部CSS
自定义
使用
改各页面title
那是不是每一页都需要单独写一个title?
改各页面meta:viewport
疑问
那怎么改全局title和meta:viewport呢
全局配置
pages/_app.js
export default function App是每个页面的根组件
页面切换时App不会销毁,App里面的组件会销毁
可用App保存全局状态
如果在_app里面添加Head和title,除非原始页面添加了Head和title,否则会使用
_app里的Head和title, 首页的head和title还是按照layout.js里的为准更新完_app需要重启服务才能生效
注意
创建_app.js之后需要重启yarn dev
全局CSS
放在_app.js里
因为切页面时App不会销毁
其他地方不能import global.css
其他地方只能写局部CSS
插曲
相对引用好烦,能改成import 'styles/global.css'吗
看文档Absolute Imports章节
局部CSS
style jsx
这种写法模仿Vue的单文件组件标签

在单独页面上使用style jsx标签不会产生冲突,就是因为单文件组件标签
这里推荐了一个Webstrom的插件叫Styled Components & Styled JSX,我看了下我的webstrom已经安装了

下面的代码还可以影响全局变量(尽量别用)
引入全局文件时路径产生错误怎么解决?
可以通过配置解决这个问题,官方文档: Absolute Imports and Module path aliases
根目录创建一个文件名为jsconfig.json,在文件中放入以下代码
CSS Modules
如何使用CSS Modules?
在
styles文件夹下创建一个以.module.css结尾的文件
在文件中引入这个文件
使用的时候如下添加
官方支持
默认支持styled-jsx和CSS Modules
一般来说,简单需求用前者,复杂需求用后者
我的个人偏好
styled-jsx不方便分离CSS和JS
CSS Modules用起来太麻烦
我更喜欢styled-components,后面有机会再改
使用SCSS
安装依赖
直接用
把后缀.css改为.scss即可
静态资源
next推荐放在public/里,方方不是很赞同
因为,放在public/里不支持改文件名
其他类型文件
图片
配置file-loader
下面这个代码我实际配置的时候不起作用,能print出来,但是还是不显示图片。
或者直接用next-images
next-images github
安装完成之后还是报错
TypeError: unsupported file type: undefined after update to v.11
解决方案参考这篇帖子:https://stackoverflow.com/questions/68008498/nextjs-typeerror-unsupported-file-type-undefined-after-update-to-v-11
就是禁用static image
最后成功的代码

SVG
一部分可以当作图片使用
icons/svg要当作SVG Symbols使用
目前没有插件,只能自己配置
更多
自己要loader,然后配置next.config.js
或者看有没有人封装成next插件
总结
创建项目
快速导航
同构代码
一份代码,两端运行
全局组件
pages/_app.js
自定义head
使用组件
全局CSS
在_app.js里import
局部CSS
<style jsx><style jsx global>不推荐xxx.module.css
SCSS
安装sass依赖即可
WebStorm技巧
安装@types/xxx
可以使WebStorm对xxx的提示更加智能
因为会自动匹配TypeScript类型和JS源码
VSCode支持吗
好像也支持,可以自行尝试
目前还是皮毛,最重要、最难懂的请看下节课
最后更新于
这有帮助吗?