Next.js项目实战踩坑指南(笔记)


Posted in Javascript onNovember 29, 2018

前言

github: https://github.com/code-coder/next-mobile-complete-app

已经用Next.js快两个月了,项目已经提测了,这里总结一下开发过程中,以及在部署的时候遇到一些棘手的问题。

疑难杂症

1. 移动端overflow:auto,ios滚动卡顿

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

2. dev mode路由跳转后样式丢失

原因:dev下样式根据页面动态加载,浏览器缓存文件styles.chunk.css造成样式不更新。

解决方案: 利用版本号强制重载样式文件

示例1:

// 在Layout组件中
<Head>
  <title>{title}</title>
  {process.env.NODE_ENV !== 'production' && (<link rel="stylesheet" type="text/css" href={'/_next/static/css/styles.chunk.css?v=' + Router.route} />)}
</Head>

示例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 键盘弹起窗口会变小,有 flex 或者 position 是 absolute 或者 fixed 布局会变

这里直接把body.height设置为浏览器的窗口高度。

doc.body.style.height = docEl.clientHeight + 'px';

4、跨域及传递cookie的问题

第一步,登录成功后api服务器返回cookie。

跨域访问要接收cookie,解决办法也很简单只需要API服务器根据请求地址设置Access-Control-Allow-Origin的值为请求地址的ip就可以了(测试环境可以动态设置这个ip,生产可以设置指定的域名或者ip地址)。

第二步,浏览器自动缓存,再后续请求中携带此cookie。

fetch或axois请求都默认不带cookie,需要通过option配置打开。

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

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

另外,还可以通过服务器代理走内网访问api。

以下为我们公司所采用的解决方案:

为了解决跨域以及部署不同服务器需要修改 api 地址的问题,我们使用 前端服务器代理 + dns 解析。整个流程如下图所示:

Next.js项目实战踩坑指南(笔记)

通过NODE_ENV环境变量来配置开发和生产的地址。

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, // 客户端渲染请求,是个相对地址,在前端服务器被代理到API服务器
 'process.env.BACKEND_URL_SERVER_SIDE': process.env.BACKEND_URL_SERVER_SIDE // 服务端渲染请求,是API服务器地址,仅供内网访问
};

5、服务端渲染时带 cookie 请求的问题

这里用到一个插件叫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 };
 }

然后就可以通过页面请求:

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

proxyFetch中就会根据isServer的值来分辨是服务端API请求还是客户端API请求。服务端请求会把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 })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
Javascript学习笔记5 类和对象
Jan 11 Javascript
JS图像无缝滚动脚本非常好用
Feb 10 Javascript
jQuery实现html元素拖拽
Jul 21 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
Jan 26 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
Scala解析Json字符串的实例详解
Oct 11 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
Apr 03 Javascript
JS监听事件的叠加和移除功能
Nov 19 Javascript
vue+iview使用树形控件的具体使用
Nov 02 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 #Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 #Javascript
js实现每日签到功能
Nov 29 #Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 #Javascript
javascript实现考勤日历功能
Nov 29 #Javascript
vsCode安装使用教程和插件安装方法
Aug 24 #Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 #Javascript
You might like
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php车辆违章查询数据示例
2016/10/14 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
几道PHP面试题
2013/04/14 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
校友会欢迎辞
2014/01/13 职场文书
个人银行贷款担保书
2014/04/01 职场文书
建筑工地大门标语
2014/06/18 职场文书
网络技术专业求职信
2014/07/13 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS
前端JavaScript大管家 package.json
2021/11/02 Javascript
详解Python中的for循环
2022/04/30 Python