1. 简单的介绍一下

nextjs是react进行服务端渲染的一个工具,默认以根目录下的pages为渲染路由

比如我在pages目录下创建一个index.js文件,然后export default一个组件,就会在页面上呈现出来这个组件

这个特性作为他最知名的优点,所以被人认为是一个很很好的后端渲染工具

多用一段时间,会踩到一些坑,功能都不是白用的,想用那么牛逼的东西,要是知道的太肤浅,驾驭不了也很难受。

所以我们不得不深入了解一下

2. webpack config

用脚趾头想一下,要让react代码在服务端跑,还不是得用webpack编译嘛

所以nextjs内部肯定偷偷的封装了一层webpack的编译工具

next怎么去配置webpack呢

方法1

在更目录下的next.config.js里写配置

方法2

写个自定义的server 然后执行

比如第一种张这个样子

const path = require('path')
const webpack = require('webpack')
const withTs = require('@zeit/next-typescript')
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') module.exports = withTs({
webpack(config) {
config.resolve.alias = {
'styled-components': path.resolve('node_modules', 'styled-components')
} if (process.env.ANALYZE) {
config.plugins.push(
new BundleAnalyzerPlugin({
analyzerMode: 'server',
openAnalyzer: true
})
)
} config.plugins.push(new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /zh-cn/)) config.plugins.push(new webpack.EnvironmentPlugin(['ENV'])) return config
}
})

第二种样子会特别一点,只需要注意中间let conf的那一段代码就好了

const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');
const withScss = require('@zeit/next-sass');
const withTs = require('@zeit/next-typescript')
const dev = process.env.NODE_ENV !== 'production' let conf = {
pageExtensions: ['jsx', 'js', 'mdsx'],
webpack(config) {
config.module.rules.push(
{
test: /\.(mdsx)$/,
use: ['next-babel-loader', 'zeus-md-next-loader', 'zeus-md-loader']
}
);
return config;
}
}
conf = withScss(conf)
conf = withTs(conf)
const app = next({ dev, conf })
const handle = app.getRequestHandler() app.prepare().then(() => {
createServer((req, res) => {
const parsedUrl = parse(req.url, true)
const { pathname, query } = parsedUrl if (pathname === '/') {
app.render(req, res, '/home', query)
} else {
handle(req, res, parsedUrl)
}
}).listen(, err => {
if (err) throw err
console.log('> Ready on http://localhost:8082')
})
})

当然并不是要用自定义服务器就不能抽离next.config.js了

是可以的,next有一个server,所以我们才会有next build, next dev, next start的命令。

这个server和我们自定义的server差不多,他会在执行next()这个方法的时候去找option.conf,如果找不到就会去找next.config.js里的了,那找到了就不管next.config.js了

对了,他也有自己默认的配置,所以我们写的配置是拿过去和原有的config合并的,不是代替原来的,因此这些config的写法和webpack里的是有点点区别的,多会去使用push,assign之类的

总而言之next的webpack的自定义能力还是比较强的,不需要担心配置webpack

3. 热更新

使用热更新是一件让开发很爽的事情,对于前端来说,代码和展示是同步的好么,对了我说的不是那种刷新浏览器的热更新,是不刷新的那种热更新

nextjs的热更新的同步很快的,快到让开发觉得觉得从此写前端是一件很嗨皮的事情了。我觉得一个后端如果发现了这个秘密,都会每天偷偷的撸几个前端页面嗨皮一下了

盲目的沉迷是就是误入歧途,所以我决定做一个理性的追随者

实现的原理比较简(fu)单(za)

Nodejs 热更新 原理及代码   来自某个网友的回答

1. 监视文件被改动的时候

2. 将缓冲区中已加载的对应模块清除

3. 此时缓冲区中就不保留有该文件模块的代码

4. 直至下一个请求该文件模块到来时,才会去重新加载一遍对应的模块,而正是改动之后的文件模块。

  • 如何更新模块代码

  • 如何使用新模块处理请求

  • 如何释放老模块的资源

nextjs服务端渲染原理的更多相关文章

  1. nextjs 服务端渲染请求参数

    Post.getInitialProps = async function (context) { const { id } = context.query const res = await fet ...

  2. 如何使用Vue2做服务端渲染

    花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SS ...

  3. 详解react/redux的服务端渲染:页面性能与SEO

        亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染)   react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...

  4. Egg + Vue 服务端渲染工程化实现

    在实现 egg + vue 服务端渲染工程化实现之前,我们先来看看前面两篇关于Webpack构建和Egg的文章: 在 Webpack工程化解决方案easywebpack 文章中我们提到了基于 Vue ...

  5. Angular开发实践(六):服务端渲染

    Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术. 标 ...

  6. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)

    缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...

  7. Vue(服务端渲染)

    一.前言 1.服务端渲染图解                                                 2.简介服务端渲染                             ...

  8. 实现ssr服务端渲染

    前言 前段时间寻思做个个人网站,然后就立马行动了.  个人网站如何实现选择什么技术方案,自己可以自由决定.  刚好之前有大致想过服务端渲染,加载速度快,还有 SEO 挺适合个人网站的.  所以就自己造 ...

  9. 【redux】详解react/redux的服务端渲染:页面性能与SEO

        亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染)   react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...

随机推荐

  1. android gradle 和gradle plugin

    android gradle 和gradle plugin 1.安装完AS3.5.2创建完项目一运行,报了如下错误 Error:Could not find com.android.tools.bui ...

  2. SpringCloud网关无法加载权限及IP黑名单白名单

    启动springcloud服务注册中心base,再启动网关远程调用base的接口读取权限等数据,控制台出现加载null权限ERROR提示.在远程调用处打断点,先进入代理,找到抛出异常的原因是reque ...

  3. 【牛客Wannafly挑战赛12】小H和圣诞树

    题目 可以考虑边分治,对于某一种颜色,我们处理出分治边左右两边所有以这个颜色为端点的路径长度,之后随便拼一拼就好了 但是这样对于每一组询问都需要边分一遍,这样做复杂度是\(O(nm+n\log n)\ ...

  4. sparkStreaming入门

    1.环境 jdk : 1.8 scala : 2.11.7 hadoop:2.7 spark : 2.2.0 2. 开发工具 idea 2017.2 3.maven的pom文件 <depende ...

  5. java自定义注解代码练习

    /** * 自定义注解:校验非空字段 * */ @Documented @Inherited // 接口.类.枚举.注解 @Target(ElementType.FIELD) //只是在运行时通过反射 ...

  6. CNN网络中的不变性理解

    神经网络中的不变性 原文:https://blog.csdn.net/voxel_grid/article/details/79275637     个人认为cnn中conv层对应的是“等变性”(Eq ...

  7. Leetcode143. Reorder List重排链表

    给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例 1: ...

  8. display: -webkit-box; 做个小小试验

    最近做个微信项目发现css3在微信内部浏览器中和其他浏览有些区别 做个小小笔记 .job { display: -webkit-box; display: flexbox; -webkit-box-p ...

  9. [JZOJ1320] 【Usaco2009 gold 】拯救奶牛

    题目 题目大意 一个三角形的网格图,三角形与其有共同边的三角形相连. 起点到所有终点的最短距离. 思考历程 数据看起来还挺大的,所以不是什么图论算法. 这显然是一个结论题. 什么结论? 然后我就开始推 ...

  10. ip地址分类和子网掩码学习笔记

    关于ip的一些学习心得 ip的概念其实很好理解,也很形象,就像一个门牌号一样,让人困惑的其实不是ip的概念本身,而是在日常计算机网络使用中,碰到很多有特殊意义的ip地址,例如,127.0.0.1,19 ...