国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Next.js項(xiàng)目實(shí)戰(zhàn)踩坑指南

用戶83 / 1992人閱讀

摘要:項(xiàng)目實(shí)戰(zhàn)踩坑指南移動(dòng)端,滾動(dòng)卡頓解決方案主容器增加樣式路由跳轉(zhuǎn)后樣式丟失原因下樣式根據(jù)頁面動(dòng)態(tài)加載,瀏覽器緩存文件造成樣式不更新。跨域及傳遞的問題第一步,登錄成功后服務(wù)器返回。第二步,瀏覽器自動(dòng)緩存,再后續(xù)請(qǐng)求中攜帶此。

項(xiàng)目實(shí)戰(zhàn)踩坑指南 1. 移動(dòng)端overflow:auto,ios滾動(dòng)卡頓

解決方案: 主容器增加樣式-webkit-overflow-scrolling: touch;

2. dev mode路由跳轉(zhuǎn)后樣式丟失

原因:dev下樣式根據(jù)頁面動(dòng)態(tài)加載,瀏覽器緩存文件styles.chunk.css造成樣式不更新。
解決方案: 利用版本號(hào)強(qiáng)制重載樣式文件
示例1:

// 在Layout組件中

    {title}
    {process.env.NODE_ENV !== "production" && ()}

示例2:

// 在_app.js中
import Router from "next/router";

Router.events.on("routeChangeComplete", () => {
  if (process.env.NODE_ENV !== "production") {
    const els = document.querySelectorAll("link[href*="/_next/static/css/styles.chunk.css"]");
    const timestamp = new Date().valueOf();
    els[0].href = "/_next/static/css/styles.chunk.css?v=" + timestamp;
  }
});
3、Android 鍵盤彈起窗口會(huì)變小,有 flex 或者 position 是 absolute 或者 fixed 布局會(huì)變

這里直接把body.height設(shè)置為瀏覽器的窗口高度。

doc.body.style.height = docEl.clientHeight + "px";
4、跨域及傳遞cookie的問題

第一步,登錄成功后api服務(wù)器返回cookie。

跨域訪問要接收cookie,解決辦法也很簡(jiǎn)單只需要API服務(wù)器根據(jù)請(qǐng)求地址設(shè)置Access-Control-Allow-Origin的值為請(qǐng)求地址的ip就可以了(測(cè)試環(huán)境可以動(dòng)態(tài)設(shè)置這個(gè)ip,生產(chǎn)可以設(shè)置指定的域名或者ip地址)。

第二步,瀏覽器自動(dòng)緩存,再后續(xù)請(qǐng)求中攜帶此cookie。

fetch或axois請(qǐng)求都默認(rèn)不帶cookie,需要通過option配置打開。

- fetch要配置`{ credentials: "include", mode: "cors" }`

- axois要配置`axios.defaults.withCredentials=true;`


另外,還可以通過服務(wù)器代理走內(nèi)網(wǎng)訪問api。

以下為我們公司所采用的解決方案:

為了解決跨域以及部署不同服務(wù)器需要修改 api 地址的問題,我們使用 前端服務(wù)器代理 + dns 解析。整個(gè)流程如下圖所示:

通過NODE_ENV環(huán)境變量來配置開發(fā)和生產(chǎn)的地址。在env-config.js

const isProd = process.env.NODE_ENV === "production";
process.env.BACKEND_URL = isProd ? "/relative_url" : "http://text.api.com";
process.env.BACKEND_URL_SERVER_SIDE = isProd ? "http://bff.api.com" : "https://prod.api.com";

module.exports = {
  "process.env.BACKEND_URL": process.env.BACKEND_URL, // 客戶端渲染請(qǐng)求,是個(gè)相對(duì)地址,在前端服務(wù)器被代理到API服務(wù)器
  "process.env.BACKEND_URL_SERVER_SIDE": process.env.BACKEND_URL_SERVER_SIDE, // 服務(wù)端渲染請(qǐng)求,是API服務(wù)器地址,僅供內(nèi)網(wǎng)訪問
  "process.env.LOCATION_PREFIX": process.env.LOCATION_PREFIX
};
5、服務(wù)端渲染時(shí)帶 cookie 請(qǐng)求的問題

這里用到一個(gè)插件叫nookies。

_app.js中全局解析cookies注入ctx:

static async getInitialProps({ Component, ctx }) {
    let pageProps = {};

    let cookies = {};
    if (ctx.isServer) {
      cookies = parseCookies(ctx);
    }
    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps({ ctx, cookies });
    }

    return { pageProps };
  }

然后就可以通過頁面請(qǐng)求:

static async getInitialProps({ ctx }) {
    const { store, req, isServer, cookies } = ctx;
    store.dispatch(setNav({ navTitle: "Home", isHome: true }));
    store.dispatch(getDataStart({ settings: { isServer, cookies } }));
  }

proxyFetch中就會(huì)根據(jù)isServer的值來分辨是服務(wù)端API請(qǐng)求還是客戶端API請(qǐng)求。服務(wù)端請(qǐng)求會(huì)把cookies寫入Fetch的header中。

const prefix = isServer ? process.env.BACKEND_URL_SERVER_SIDE : process.env.BACKEND_URL;
isServer && (this.headers["cookie"] = "EGG_SESS=" + cookies["EGG_SESS"] + ";";)
// fetch核心
fetch(prefix + url, { headers: this.headers, ...this.init, ...options })
6、需要部署到域名下的二級(jí)目錄如:www.example.com/project

在某些公司的業(yè)務(wù)場(chǎng)景下:如共享cookie等需求,則需要將項(xiàng)目部署到域名的一個(gè)二級(jí)目錄下。

這時(shí)需要修改配置文件next.config.js

module.exports = withSass({
    assetPrefix: process.env.NODE_ENV === "production" ? "/project" : ""
});

這個(gè)配置文件是修改next在build的時(shí)候指向的根目錄地址。但是由于Next.js的路由根目錄為pages,客戶端的路由跳轉(zhuǎn)后,生成的window.location.href地址會(huì)忽略二級(jí)目錄。

例如:假設(shè)我們的服務(wù)器地址為http://www.example.com/project,然后在首頁使用Router.push("/login")跳轉(zhuǎn)登錄頁面,瀏覽器會(huì)直接追加到域名+端口后生成http://www.example.com/login的地址。而我們實(shí)際的服務(wù)器地址是http://www.example.com/projec...,跳轉(zhuǎn)后再刷新頁面會(huì)報(bào)404。

這時(shí)候需要使用next提供的as參數(shù)(Router.push的第二個(gè)參數(shù),link標(biāo)簽的as屬性)。二級(jí)目錄的地址可以寫在process.env中。

每次使用路由時(shí)都要加上as參數(shù),這時(shí)可以封裝Link組件和Router來減少多余代碼。

CustomLink.js文件

import React, { Component } from "react";
import Link from "next/link";

export default class CustomLink extends Component {
  render() {
    const { href, as: asHref, children, ...props } = this.props;
    return (
      
        {children}
      
    );
  }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99534.html

相關(guān)文章

  • 從小白程序員一路晉升為大廠高級(jí)技術(shù)專家我看過哪些書籍?(建議收藏)

    摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...

    sf_wangchong 評(píng)論0 收藏0
  • Next.js踩坑入門系列(一)— Hello Next.js!

    摘要:接下來我們運(yùn)行一下。因此,我們需要新建一個(gè)目錄。接下在再重新啟動(dòng)一下試試。因?yàn)槟J(rèn)開啟服務(wù)端渲染,也就無需我們進(jìn)行任何的配置,因此現(xiàn)在這個(gè)極其簡(jiǎn)單的應(yīng)用就是一個(gè)。代碼地址參考文章服務(wù)端渲染與打造高可靠與高性能的同構(gòu)解決方案 寫在前面 說實(shí)話,我個(gè)人還是覺得文筆越來越不錯(cuò)了,以前的文章都是一個(gè)問題悶到天黑,文章寫的有點(diǎn)亂由于文章過于龐大導(dǎo)致不是一氣呵成的,思路有時(shí)候會(huì)很混亂。所以我也準(zhǔn)備...

    rockswang 評(píng)論0 收藏0
  • Next.js踩坑入門系列(二)— 添加Antd && CSS

    摘要:踩坑入門系列一二添加三目錄重構(gòu)再談路由陸續(xù)更新個(gè)人對(duì)于腳手架的有一種執(zhí)念,如果搭建出來就是一個(gè)首頁標(biāo)簽跳轉(zhuǎn),實(shí)在不是我這個(gè)處女座的風(fēng)格,因此第二步我就想引用框架,相信很多使用的開發(fā)者用的也都是這個(gè)框架吧。 Next.js踩坑入門系列 (一) Hello Next.js (二) 添加Antd && CSS (三) 目錄重構(gòu)&&再談路由 陸續(xù)更新... 個(gè)人對(duì)于腳手架的UI有一種執(zhí)...

    lifesimple 評(píng)論0 收藏0
  • 寫給前端的區(qū)塊鏈開發(fā)入門指南:零基礎(chǔ)開發(fā)基于以太坊智能合約的 ICO DApp

    摘要:圍繞以太坊的開發(fā)生態(tài)是目前相對(duì)最成熟的,比如有開發(fā)框架,有智能合約在線集成開發(fā)環(huán)境,還有專設(shè)的開發(fā)者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時(shí)代拋棄我們的時(shí)候連聲再見都不會(huì)說,馬云說對(duì)于新興事物,絕大多數(shù)人是看不見、看不起、看不懂、來不及。自從學(xué)完 Coursera 上的 Crypto...

    sean 評(píng)論0 收藏0
  • 寫給前端的區(qū)塊鏈開發(fā)入門指南:零基礎(chǔ)開發(fā)基于以太坊智能合約的 ICO DApp

    摘要:圍繞以太坊的開發(fā)生態(tài)是目前相對(duì)最成熟的,比如有開發(fā)框架,有智能合約在線集成開發(fā)環(huán)境,還有專設(shè)的開發(fā)者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時(shí)代拋棄我們的時(shí)候連聲再見都不會(huì)說,馬云說對(duì)于新興事物,絕大多數(shù)人是看不見、看不起、看不懂、來不及。自從學(xué)完 Coursera 上的 Crypto...

    yzzz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<