成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

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

用戶(hù)83 / 2049人閱讀

摘要:項(xiàng)目實(shí)戰(zhàn)踩坑指南移動(dòng)端,滾動(dòng)卡頓解決方案主容器增加樣式路由跳轉(zhuǎn)后樣式丟失原因下樣式根據(jù)頁(yè)面動(dòng)態(tài)加載,瀏覽器緩存文件造成樣式不更新??缬蚣皞鬟f的問(wèn)題第一步,登錄成功后服務(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ù)頁(yè)面動(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 鍵盤(pán)彈起窗口會(huì)變小,有 flex 或者 position 是 absolute 或者 fixed 布局會(huì)變

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

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

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

跨域訪問(wèn)要接收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,需要通過(guò)option配置打開(kāi)。

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

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


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

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

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

通過(guò)NODE_ENV環(huán)境變量來(lái)配置開(kāi)發(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, // 客戶(hù)端渲染請(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)訪問(wèn)
  "process.env.LOCATION_PREFIX": process.env.LOCATION_PREFIX
};
5、服務(wù)端渲染時(shí)帶 cookie 請(qǐng)求的問(wèn)題

這里用到一個(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 };
  }

然后就可以通過(guò)頁(yè)面請(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的值來(lái)分辨是服務(wù)端API請(qǐng)求還是客戶(hù)端API請(qǐng)求。服務(wù)端請(qǐng)求會(huì)把cookies寫(xiě)入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,客戶(hù)端的路由跳轉(zhuǎn)后,生成的window.location.href地址會(huì)忽略二級(jí)目錄。

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

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

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

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://systransis.cn/yun/99534.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

0條評(píng)論

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