React 新的文档用到了哪些技术?

sxkk20082年前知识分享153

前言

https://beta.reactjs.org React 的新的文档已经 完成了 70 % 并且呼吁社区进行翻译工作。

2022-01-13 19-03-51.2022-01-13 19_05_34.gif 新的文档采用了全新的架构 next.js + Tailwind CSS ,改版后的文档界面有种焕然一新的感觉,支持暗黑模式,我们可以在线学习,并且写代码,采用了这种所见即所得的形式,大大降低了学习者的成本,我也被这种形式所深深吸引,那么这种所见即所得的形式是如何实现的呢?

基本介绍

新文档地址在 https://github.com/reactjs/reactjs.org/ 中的 beta 目录下,外层代码是目前的文档代码,那么我们可以直接 git clone 并且拷贝 beta 目录下的内容

这里面有 yarn.lock 文件,跟绝大多数 next 项目一样 yarn install 之后,运行 yarn dev 就可以运行开发环境

s16501401132022

启动速度非常快,仅仅 3.3s, 打开 http://localhost:3000,此时 next.js 会再次编译,大概 200ms,这种优势得益于 next.js 按需编译的优势,也就是是说当前启动的时候,并不会全站打包,而是当进入某个页面的时候编译当前页面,所以速度相当快。

约定式路由

s16384301132022 next 是约定式路由,在 pages 文件夹下的目录默认生成路由,即 '/src/pages/learn/add-react-to-a-website.md' 生成路由 /learn/add-react-to-a-website

此时发现里面的文档都是.md后缀的 Markdown 文件,那么 markdown 也可以写交互功能了吗? image.png

打开 index.md,我们发现里面的代码不仅仅是 markdown 还有 react 组件,那么 这个组件是如何被解析成 react 组件的?

next 支持 Markdown

首先 next.js 是不支持 Markdown 的,我们需要让 next.js 支持 Markdown, 我们打开 next.js 的配置文件 next.config.js,

pageExtensions: ['jsx', 'js', 'ts', 'tsx', 'mdx', 'md'],

先让 next 支持 md、 mdx 格式,接下来我们来看下 webpack 部分的配置

webpack: (config, {dev, isServer, ...options}) => {
    if (process.env.ANALYZE) {
        const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
        config.plugins.push(
        new BundleAnalyzerPlugin({
            analyzerMode: 'static',
            reportFilename: options.isServer
            ? '../analyze/server.html'
            : './analyze/client.html',
        })
        );
    }

    // Add our custom markdown loader in order to support frontmatter
    // and layout
    config.module.rules.push({
        test: /.mdx?$/, // load both .md and .mdx files
        use: [
        options.defaultLoaders.babel,
        {
            loader: '@mdx-js/loader',
            options: {
            remarkPlugins,
            },
        },
        path.join(__dirname, './plugins/md-layout-loader'),
        ],
    });

    return config;
},

首先是单独安装了 webpack-bundle-analyzer 这个是打包分析插件,通过 ANALYZE=true next build 就可以生成分析包含哪些模块包的网页

s16585001132022 next.js 的分包也非常完美,每个 js 大小都差不多,并且根据页面按需加载。 下面配置是解析 markdown 的,只要是 md、mdx 都会走 @mdx-js/loader, 就是这个 @mdx-js/loader 让 markdown 支持 jsx 了。

这里面还加了一个自定义 loader

module.exports = async function (src) {
  const callback = this.async()
  const { content, data } = fm(src)
  const pageParentDir = path
    .dirname(path.relative('./src/pages', this.resourcePath))
    .split(path.sep)
    .shift()
  const layoutMap = {
    blog: 'Post',
    learn: 'Learn',
    reference: 'API',
  }
  const layout = layoutMap[pageParentDir] || 'Home'

  const code =
    `import withLayout from 'components/Layout/Layout${layout}';

export default withLayout(${JSON.stringify(data)})


` + content

  return callback(null, code)
}

通过判断父级目录自动增加 Layout,有了 layout,结构就出来了,所以 webpack 的 loader 就是一个函数,可以直接修改代码。

MDX

MDX 让 markdown 支持 jsx,我们一起来看看如何使用

import React from 'react'
import ReactDom from 'react-dom'
import Post from './post.mdx'
import { Heading, /* … */ Table } from './components/index.js'

const components = {
  h1: Heading.H1,
  // …
  table: Table,
}

ReactDom.render(<Post components={components} />, document.querySelector('#root'))

在 components 传入自定义组件,在 markdown 中就可以使用了。 也可以改成嵌套模式:

import React from 'react'
import ReactDom from 'react-dom'
import Post from './post.mdx'
import { Heading, /* … */ Table } from './components/index.js'
import { MDXProvider } from '@mdx-js/react'

const components = {
  h1: Heading.H1,
  // …
  table: Table,
}

ReactDom.render(
  <MDXProvider components={components}>
    <Post />
  MDXProvider>,
  document.querySelector('#root')
)

在线沙箱

文档中还有一种写法, 可以直接再网页中渲染一个 https://codesandbox.io/

并且文件可以引用文件,这就比较你牛了

image.png

s18303801132022

我们发现 Sandpack 里面使用了 "@codesandbox/sandpack-react" 这个包, 打开 https://sandpack.codesandbox.io/ 官网,非常酷炫的效果映入眼帘

简单几个配置就可以渲染出在线代码编辑器

<Sandpack
  customSetup={{
    dependencies: {
      'react-markdown': 'latest',
    },
    files: {
      '/App.js': `import ReactMarkdown from 'react-markdown' 

export default function App() {
  return (
    
      # Hello, *world*!
    
  )
}`,
    },
  }}
/>

image.png

小结

1、React 新文档的架构我很喜欢,代码和目录也非常清晰,非常适合阅读

2、我们一些组件库文档是否可以往 next 架构迁移?

希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章

圣禾农业

公司简介 企业文化 领导...

地址识别:从历史到未来的智能技术应用

地址识别:从历史到未来的智能技术应用

  地址识别是一项涉及到计算机视觉和人工智能的重要技术,它可以通过对图像或视频进行分析,从中提取出地址信息。随着科技的不断进步和智能化技术的快速发展,地址识别正逐渐成为现实生...

Compressor.io 

Compressor.io 可以使用有损或无损压缩优化 JPEG、PNG、SVG、GIF 和 WebP,每个文件最高可达 10MB。如果要自定义压缩或使用较大的文件,则必须付费获得高级计划。在这种情况下,压缩图片在服务器端完成,因此将获得更快的结果。

Compressor.io

Imagecompresser.com 

Imagecompresser.com 允许同时上传多达 10 个文件,并支持 PNG、JPEG、WebP、JPG 和 GIF 格式。每个图像的文件大小没有任何限制,因此这可能适用于 10 个或更少的大文件。

Imagecompresser.com

30+ 图片压缩工具集合,包含在线压缩和CLI工具

许多开发人员花费了大量时间优化网页性能,比如优化 js、css、减少 http 请求等等,但减小图片大小产生的优化比其他所有领域加起来影响更大。WebUtils Bulk Image Compress...

百度AI推动人工智能技术的创新和发展

百度AI推动人工智能技术的创新和发展

  近年来,人工智能(Artificial Intelligence,简称AI)技术的快速发展让我们深切感受到了科学技术带给人类社会的革命性变化。作为全球领先的科技公司,...

2-3 分钟后会在屏幕上输出宝塔面板的登录地址,宝塔面板会随机生成用户名、密码和端口,我们需要把这些地址保存到本地,以免下次忘记。

接下来我们需要在云服务器上设置安全组或者防火墙,放行自动生成的端口。

腾讯云配置安全组

开通了端口,输入宝塔面板地址,输入用户名和密码就可以登录了 宝塔面板登录

域名解析

腾讯云域名解析

在你的域名服务商后台,将一个域名解析到 这台这台服务器 ip,解析完成后,你就可以使用域名访问了。

安装 PHP+mysql

登录后要先绑定一个宝塔账号,这个大家自行注册就可以了 选择系统推荐的 LNMP 环境 绑定成功后,我们来安装 PHP+mysql,系统会自动弹窗框让我们来选择环境,我这里选择 LNMP

  • 急速安装,安装时间极快(5-10 分钟),版本与稳定性略低于编译安装,适合快速部署测试
  • 编译安装,安装时间长(30 分钟到 2 小时),性能最大化,适合生产环境, 点击一键安装后,宝塔面板就会开始安装环境了

LNMP 环境安装进度 等待 10 分钟后,环境安装完成,当然有经验的同学可以自行安装 PHP+mysql 的环境,但是使用宝塔面板对新手比较友好。

访问IP显示会宝塔404页面 此时访问我们的 IP 就可以看到页面,说明我们的环境已经安装成功了。

安装微擎

微擎官网:https://www.we7.cc/

微擎官方文档:https://www.kancloud.cn/donknap/we7/136557

微擎源码地址:https://gitee.com/we7coreteam/pros

微擎是一款小程序和公众号管理系统,可以实现微信平台(mp.weixin.qq.com)不能实现的功能,例如商城,餐饮,酒店,汽车,门店,同城,各类行业解决方案,营销,推广,吸粉,游戏,物联网和人工智能等功能,这些应用大部分收费,也有免费的应用,大家可以在官网上搜索安装。

点击网站,添加网站,输入你自己的要解析的域名, 宝塔面板添加网站

选择创建数据库,和 FTP,点击提交,此时输入我们的域名可以看到如下页面

宝塔默认创建的页面

说明我们的网站创建成功了。

安装微擎框架

在网站 ftp 目录下上传微擎框架的源码 上传微擎框架源码

上传完成后点击 zip 文件解压

设置网站默认站点

点击默认站点,设置我们刚才创建的网站

输入IP,开始安装微擎 输入 IP 地址,就可以进入微擎的安装页面了。 微擎安装页面检查环境

安装过程中会检查 PHP 环境要求,若检查不成功,我们需要修改相应的 PHP info 文件。

微擎配置数据库和密码

点击继续输入刚才创建的数据库信息,并且设置微擎后台密码

微擎安装完成

点击继续安装完成

《成语小秀才》部署教程

前言相信很多朋友都玩过这款小游戏,叫成语秀才,没体验过的朋友可以点击这里,扫码体验,这款小游戏开发起来还是比较困难的,首先要有一份海量的题库,然后在每道题都有不同的布局,我是一个非常喜欢学习的人,于是...

用 TailwindCSS 打造美好祝福:给大家送上新年祝福的 demo

前几天,群里有有伙伴问,在 Next.js 中,该使用哪个 UI 框架?我强烈推荐 tailwindcss, 因为你不再需要写 CSS 代码了,这 2 天还录制了一个视频,包括录屏、录音、剪辑、动画等...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。