Skip to main content

SSR vs CSR

CSR - Client side render


SSR - Server side render

优点一: 性能好

优点二: 易于SEO搜索引擎优化

缺点: 开发成本高 (前端框架 + Node.js, 全栈)


应用场景: 

1) 对性能要求高的系统,如移动端,弱网环境

2) 操作交互较简单的系统,否则复杂度会更高

如我的项目中的B端,不适合SSR,因为操作比较复杂


常见的SSR框架: 

React - Next.js (Remix.js)

Vue - Nuxt.js



Next.js

安装:

npx create-next-app@latest


启动:

npm run dev


or

-------

npm run build

npm run start

-------


创建一个简单的网页并且访问:

可以在pages目录下面创建about.tsx,就可以用过localhost:xxx/about来访问了

import Head from 'next/head';

export default function About() {
return <>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<p>hi</p>
</main></>;
}


API

在/api目录下

api的url为 localhost:3000/api/hello


静态资源

在/public目录下,可以创建一个/data,然后再创建一个info.json

就可以使用localhost:3000/data/info.json来访问静态资源


两种形式的pre-render

1) 静态生成(Static Generation)项目构建时,直接产出HTML文件

在静态页面中 请求数据

<p>{props.info}</p>


//只在build的时候执行

export async function getStaticProps() {

    return {

        props: {

            info: "xxxx"

        }

    }

}

上面的代码仅会在构建的时候执行一次。每次请求的时候,都会返回一样的内容


2) Server-side rendering, 每次请求时动态生成HTML

一般需要动态获取数据并计算整合

与上面静态生成不同,使用以下函数

//每次请求的时候都会执行

export async function getServerSideProps() {

    return {

        props: {

            info: "请求来的数据"

        }

    }

}


如何获取动态数据?

比如需要的api为localhost:3000/question/12345

可以在/src/pages/question/ 目录下面创建[id].tsx文件,在文件里面使用

export async function getServerSideProps(context: any) {
const { id = "" } = context.params;

return {
props: {
id,
}

}
}

即可获取id


同理, 如果要使用data数据

可以在/src/pages/stats/目录下面创建[data].tsx

然后在上面的函数中获取data即可






Comments

Popular posts from this blog

Templates

  Template - Polymorphism is the ability of the same code to operate on different types. This ability to operate on multiple types reduces code duplication by allowing the same piece of code to be reused across the different types it can operate on. - Polymorphism comes in a variety of forms. What we are interested in at the moment is parametric polymorphism, meaning that we can write our code so that it is parameterized over what type it operates on.  -That is, we want to declare a type parameter T and replace int with T in the above code. -Then, when we want to call the function, we can specify the type for T and get the function we desire. C++ provides parametric polymorphism through templates. Templated Functions - We can write a templated function by using the keyword template followed by the template parameters in angle brackets (<>). - Unlike function parameters, template parameters may be types, which are specified with typename where the type of the parameter wo...

前端 优化代码体积

当我使用npm run build的时候,项目构建了很久。所以考虑用create-react-app网站下面的工具来缩小代码体积  Analyzing the Bundle Size https://create-react-app.dev/docs/analyzing-the-bundle-size 更改完成后 npm run build npm run analyze 可以看到以下的图片: 其中main.js有1.57mb 然后起服务 serve -s build -l 8000 进入到首页之后,打开network,查看js,发现main.js有500kb。这个500kb是已经用gzip压缩过了,但是却还有这么大。500*3=1500说明源文件有1.5mb左右 其中, antd占了25%, recharts占了13%, react-dom占了7.6%,dnd-kit占了2.8% 其中recharts用于统计页面,dnd-kit用于拖拽排序-编辑器页面。 所以在加载首页的时候,先不加载编辑页面和统计页面的js的话,体积会小很多。 路由懒加载 因为项目中,体积占比最大的是Edit和Stat页面(编辑和统计页面),所以考虑使用路由懒加载,拆分bundle,优化首页体积 router文件中,之前: import Edit from "../pages/question/Edit" ; import Stat from "../pages/question/Stat" ; 现在: const Edit = lazy (() => import ( "../pages/question/Edit" )); const Stat = lazy (() => import ( "../pages/question/Stat" )); 为了让生成的文件更加可读,可以改成下面这样: const Edit = lazy ( () => import ( /* webpackChunkName: "editPage" */ "../pages/question/Edit" ) ); const Stat ...

useMemo的使用场景

 useMemo是用来缓存 计算属性 的。 计算属性是函数的返回值,或者说那些以返回一个值为目标的函数。 有些函数会需要我们手动去点击,有些函数是直接在渲染的时候就执行,在DOM区域被当作属性值一样去使用。后者被称为计算属性。 e.g. const Component = () => { const [ params1 , setParams1 ] = useState ( 0 ); const [ params2 , setParams2 ] = useState ( 0 ); //这种是需要我们手动去调用的函数 const handleFun1 = () => { console . log ( "我需要手动调用,你不点击我不执行" ); setParams1 (( val ) => val + 1 ); }; //这种被称为计算属性,不需要手动调用,在渲染阶段就会执行的。 const computedFun2 = () => { console . log ( "我又执行计算了" ); return params2 ; }; return ( < div onClick = { handleFun1 } > //每次重新渲染的时候我就会执行 computed: { computedFun2 () } </ div > ); }; 上面的代码中,在每次点击div的时候,因为setParams1的缘故,导致params1改变,整个组件都需要重新渲染,也导致comptedFunc2()也需要重新计算。如果computedFunc2的计算量很大,这时候重新计算会比较浪费。 可以使用useMemo: const Com = () => { const [ params1 , setParams1 ] = useState ( 0 ); const [ params2 , setParams2 ] = useState ( 0 ); //这种是需要我们手动去调用的函数 const handleFun1 ...