文档 https://www.nextjs.cn/docs/basic-features/typescript

  1. 安装ts

yarn global add typescript

  1. 创建tsconfig.json

tsc —init 运行后得到tsconfig.json

  1. 将jsconfig.json里面的配置合并到tsconfig.json
  2. 删除jsconfig.json
  3. 安装一些依赖 更好地开发跟ide提示

    yarn add —dev typescript @types/react @types/node @types/react-dom

  4. yarn dev

然后他会自动帮我们改一些东西,如下:

启用TypeScript 开发Next - 图1

尝试把index.js 改成 index.tsx

启用TypeScript 开发Next - 图2

然后报了个错

启用TypeScript 开发Next - 图3

直接谷歌 : TS2307: Cannot find module jpg (省略中间的文件路径)

在stackflow找到这个答案 按他说的去做

启用TypeScript 开发Next - 图4

但是我的文件夹里面没有src,我找到了一个文件叫next-env.d.ts的文件,直接在里面加就可以了

启用TypeScript 开发Next - 图5

遇到ts问题不要慌,把webstorm给你的报错信息,复制到谷歌就好了。

  • tsconfig 加强
  • 在tsconfig.json里添加: “noImplicitAny”: true
  • 禁用隐式的any

我的第一个请求

在/pages/api里新建一个文件 /v1/posts.tsx

启用TypeScript 开发Next - 图6

  1. import {NextApiHandler} from 'next';
  2. const Posts:NextApiHandler =(req,res)=>{
  3. res.statusCode = 200;
  4. res.setHeader('Content-Type','application/json')
  5. res.write(JSON.stringify({name:"hasson"}))
  6. res.end()
  7. }
  8. export default Posts;

启用TypeScript 开发Next - 图7

  • 路径为/api/v1/posts 以便与/posts区分开来
  • 默认导出的函数的类型为NextApiHandler
  • 该代码只运行在Node.js里,不运行在浏览器中

把博客发送到前端

https://github.com/E1FANG/next-blog-1

commit: https://github.com/E1FANG/next-blog-1/commit/2ae85c8607d1de556d5c7e231d20112f1609fea3

/api/v1/posts.tsx

发一个请求,把返回的东西写到页面上

  1. import {NextApiHandler} from 'next';
  2. import {getPosts} from 'lib/posts';
  3. const Posts:NextApiHandler =async (req,res)=>{
  4. const posts = await getPosts()
  5. res.statusCode = 200;
  6. res.setHeader('Content-Type','application/json')
  7. res.write(JSON.stringify(posts))
  8. res.end()
  9. }
  10. export default Posts;

把如何拿到博客markdown内容封装成一个库

lib就是库的意思

/lib/posts.tsx

  1. import path from 'path';
  2. import {promises as fsPromise} from 'fs';
  3. import * as fs from 'fs';
  4. import matter from 'gray-matter';
  5. export const getPosts = async () => {
  6. //process.cwd() // current working dir 当前的工作目录
  7. const markdownDir = path.join(process.cwd(), 'markdown'); //拿到markdown的目录路径
  8. const fileNames = await fsPromise.readdir(markdownDir); //拿到所有的文件名
  9. let posts: { date: any; id: string; title: any; content: string }[];
  10. posts = fileNames.map(fileName => {
  11. const fullPath = path.join(markdownDir, fileName);
  12. const id = fileName.replace(/\.md$/g, '');
  13. const text = fs.readFileSync(fullPath, 'utf-8'); //同步读取文件,在循环里面异步读取文件可能会有问题
  14. // const {data,content} = matter(text)
  15. // const {title,date} = data
  16. const {data: {title, date}, content} = matter(text);
  17. return {
  18. id, title, date, content
  19. };
  20. });
  21. console.log(posts);
  22. return posts;
  23. };

上面的代码用到了gray-matter库

它是一个专门用来解析博客内容的库

yarn add gray-matter

https://github.com/jonschlinkert/gray-matter 官方文档会介绍怎么用的

  • /api/里的文件就是API
    • 一般返回JSON格式的字符串
    • 但也不是不能返回HTML,比如res.end(`

      ….