摘要:項(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
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過哪些技術(shù)類書籍。 大家好,我是...
摘要:接下來我們運(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)備...
摘要:踩坑入門系列一二添加三目錄重構(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í)...
摘要:圍繞以太坊的開發(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...
摘要:圍繞以太坊的開發(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...
閱讀 742·2021-07-25 21:37
閱讀 3654·2019-08-30 15:55
閱讀 2572·2019-08-30 15:54
閱讀 1717·2019-08-30 15:44
閱讀 3123·2019-08-30 15:44
閱讀 859·2019-08-30 15:43
閱讀 1021·2019-08-29 15:36
閱讀 3038·2019-08-29 10:58