next.js 初步开发到部署

文档:https://nextjs.org/docs/getting-started

1 创建项目TS

yarn create next-app --typescript nextjs_demo

2. 配置项目

修改_app.tsx, 各种Provider都可以写在这里

import '../styles/globals.css'
import 'antd/dist/antd.css'
import type { AppProps } from 'next/app'

import { ThemeProvider } from 'styled-components'

function MyApp({ Component, pageProps }:AppProps) {
  return  <ThemeProvider theme={{
    color:'red',
    fontSize:'40px'
  }}>
    <Component {...pageProps} />
  </ThemeProvider>
}

export default MyApp

3. next/image的使用

<Image
        src={'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi2.hdslb.com%2Fbfs%2Farchive%2F3c90eb673244c95ff63bf3255230d1070a56a8e5.jpg&refer=http%3A%2F%2Fi2.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1664009576&t=b38110e63b3bf95d420e63b9c9c81f53'}
        width={800}
        height={312}
        placeholder="blur"
        blurDataURL='data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAIAAoDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAhEAACAQMDBQAAAAAAAAAAAAABAgMABAUGIWEREiMxUf/EABUBAQEAAAAAAAAAAAAAAAAAAAMF/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECEgMRkf/aAAwDAQACEQMRAD8AltJagyeH0AthI5xdrLcNM91BF5pX2HaH9bcfaSXWGaRmknyJckliyjqTzSlT54b6bk+h0R//2Q=='
      />

4. 静态资源放到public文件夹下

image.png

5.getServerSideProps 和 getStaticProps 的区别

getStaticProps:构建时就会执行,服务器上运行,生成静态HTML,每个人请求就会很快返回,不会白屏
https://nextjs.org/docs/basic-features/data-fetching/get-static-props

  1. 纯静态页面
  2. 页面数据基本不变、许久变一次
export async function getStaticProps() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()
  return {
    props: {
      posts,
    },
    revalidate: 24*60*60,  //1天更新一次 (单位秒)
  }
}

getServerSideProps:预渲染数据,每次页面请求都会执行
https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props

  1. 预渲染数据,先请求一屏的数据缓存起来(看起来页面加载快、无白屏)

6.页面动态导入(取消服务器渲染,比如本地判断window、isMobile等)

页面中的各种组件也可以动态导入(先显示loading)

index.tsx

import dynamic from 'next/dynamic'
export default dynamic(
  ()=>import('./views/home'),
  {
    ssr:false,
    loading:()=><></>
  }
)

7. 安装styled-components

yarn add babel-plugin-styled-components --dev
.babelrc

{
  "presets": ["next/babel"],
  "plugins": [
    ["styled-components", { "ssr": true, "displayName": true }],
    [
      "import",
      {
        "libraryName":"antd"
      }
    ]
  ]
}

8.导入google字体,创建_document.tsx

import Document, { Html, Head, Main, NextScript } from "next/document";

class MyDocument extends Document {
  static async getInitialProps(ctx:any) {
    const initialProps = await Document.getInitialProps(ctx);
    return { ...initialProps };
  }

  render() {
    return (
      <Html>
        <Head>
          <link
            href="https://fonts.googleapis.com/css2?family=Lobster"
            rel="stylesheet"
          />
          <link
            href="https://fonts.googleapis.com/css2?family=Roboto Condensed"
            rel="stylesheet"
          />

        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

9.部署服务器nginx

1. 部署到自己的服务器上(联系后台人员进行配置)

http://www.shanhuxueyuan.com/news/detail/111.html
nextjs打包后的文件存储在.next文件夹,但是只有这个文件夹下的内容是不够的,因为要在node端运行,还需要next以及react及reactDom等,简单起见,我们可以把整个项目都传到服务器。这样的缺点就是node_modules比较大,不过这样最简单。 在服务器端,进入项目路径 依次执行 npm run build ,npm run start即可将项目运行在服务器端,默认是localhost:3000,我们肯定是要通过域名访问项目,因此还需要进行域名配置,可通过nginx反向代理来实现。

server {
  listen  80;
  server_name  yourdomain.com;

  error_log  /var/log/nginx/yourdomain_error.log;

  location / {
      proxy_pass     
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
  }
}
  • 现在可以通过域名访问了,但是还是存在一个问题,就是我们刚才执行的npm run start命令,必须打开命令行才有效,一旦关闭命令行,进程也终止了,简单的做法就是通过nohup在后台执行 npm run start ,这样关闭命令行仍然有效。
nohup   npm run start &
  • PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单
    npm install -g pm2
    为了简单的使用pm2,我们先把项目下的package.json中添加一个server指令,server指令依次执行next build和next start
"scripts": {
  "dev": "next",
  "build": "next build",
  "start": "next start",
  "server":"next build && next start", //添加server指令
},

进入到项目所在目录
执行如下命令

pm2 start npm --name yourName -- run server --watch

将yourName换成你的项目名,这个是给这个进程起的名称,可以随意
--watch代表监听项目文件,当文件发生变化是,自动重新加载如下指令,这样就很方便了,当我们更改代码之后,只需要传到服务器即可,pm2会自动监听,重新执行 npm run server

这样就完成服务器部署了,可能有的同学还想服务器重启之后自动运行这个命令,使用pm2也很简单只需执行如下命令即可

pm2 startup

2. 部署到vercel上(最后的链接如此:https://nextjs-demo-self.vercel.app/

    1. 将代码push到自己的github
  • 2.打开https://vercel.com/dashboard用自己的github账号登录,选择项目
    1. 如果自定义了输出目录这里也要改成一致
const nextConfig = {
  reactStrictMode: true,
  swcMinify: true,
  images: {
    domains: ['gimg2.baidu.com'],
  },
    // distDir: 'build',
    exportPathMap: async function (
        defaultPathMap,
        { dev, dir, outDir, distDir, buildId }
    ) {
        return {
            '/': { page: '/' },
        };
    },
    images: {
        loader: 'akamai',
        path:'',
    }
}
image.png
    1. deploy
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容