问题

在开发一些「单页应用」时,通常会使用 Ajax 和服务器通讯,比如 RESTful API,通常「前端」和「服务端 API」可能是有不同人员在负责,也不在同一个工程下,那么开发过程中就可能会遇到跨域的问题,比如 Chrome 会在 console 中看到这样的错误消息:

XMLHttpRequest cannot load http://google.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://run.jsbin.io' is therefore not allowed access.

浏览器因为安全原因,有「同源策略」不允许「跨域」,有时也会给开发过程带来一点点小麻烦。

常见方法

1. Access-Control-Allow-Origin

目前主流浏览器都支持,通过在服务器的响应头信息中添加 Access-Control-Allow-Origin 以声明允许来自那些「域」的跨域请求,比如:

Access-Control-Allow-Origin: xxx.xyz

也可以允许任何来源的跨域请求

Access-Control-Allow-Origin: *

很少有场景必须要在「生产环境」使用 *,如果开发环境使用 *,那么在部署到生产环境时,为了安全启见,无论手动还是自动的方式,都需要换成「特定的域」

当然在开发环境也可指定特定的「域」,如上边的 xxx.xyz,那开发过程中就需要每个开发人员添加 host 配置,如下:

127.0.0.1 xxx.xyz
1. nginx 反向代理

用代理的方式解决的跨域问题,就不要添加什么「响应头」了,用 nginx 搭建一个「用于开发」的 WebServer,然后,我们可以把某些 URL 转发到「目标地址」,然后前端用 ajax 请求同域下的地址,这样自然就不存在「跨域问题」了,nginx 配置大约如下:

...
location /api/ {
rewrite ^/api/(.*) /$1 break;
...
}
...

这个方式,需要让每个前端开发人员安装并配置 nginx,虽然可以正好学习 nginx,却还是稍显麻烦。

用 Nokitjs 解决问题

Nokitjs 是一个「A Web development framework」,和 express/koa/hapi 等框架类似,用于开发「Web 应用或网站」,这里不去比较各个框架的优劣,而是去解决「跨域」问题。

Nokitjs 提供了「命令行工具」,在终端中直接使用「Nokit CLI」需要全局安装 Nokit:

npm install nokitjs -g

Nokit CLI 一般用于启动「基于 Nokit 开发的应用」,同时它也能在「指定的目录」启动一个「静态 WebServer」,如下:

nokit start [端口] [应用目录省略时为当前目录] [其它选项]

「其它选项」中有一个 -pulibc 选项,可以指定「静态资源目录」,如下命令,将在当前目录启一个「静态 WebServer」

npm start 8000 -public=./

如何解决跨域问题?,还需要一个插件 nokit-filter-proxy,接下来用一个实例说明,假如我们有一个工程,结构如下:

应用目录
├── dist
├── package.json
└── src

dist 是「构建工具」Build 的目标目录,src 是源码目录,package.json 是 NPM 包配置文件。

安装 nokitjs 和 nokit-filter-proxy 并保存到 devDependencies

npm install nokitjs nokit-filter-proxy --save-dev

配置 package.jsonscripts,如下

...
"scripts": {
"start": "nokit start 8000 -public=./dist",
"stop": "nokit stop",
"restart": "npm stop && npm start",
...
}
...

现在,「不需要全局安装」 nokitjs,在「应用目录」执行:

npm start

即可启动一个「静态 WebServer」,将会看到如下提示:

[Nokit][L]: Starting...
[Nokit][L]: The server on "localhost:8000" started

就可以在浏览器中访问 http://localhost:8000 了。

然后配置 nokit-filter-proxy,在「应用目录」新建一个文件 config.json,写入如下内容:

{
"filters": {
"^/": "nokit-filter-proxy"
},
"proxy": {
"rules": {
"^/api/(.*)": "http://xxx.xyz/"
}
}
}

如上配置,首先注册了 nokit-filter-proxy,然后添加了一条转发规则,将所有 /api 开头的 URL 转发到 http://xxx.xyz/,比如:

GET /api/user/id

将会被转发到

GET http://xxx.xyz/user/id

可以添加任意多条转发规则,规则越靠后优化级越高。

相比 nginx 省事不少,不需要每个开发人员再安装配置 nginx,可以在获取代码后,直接执行

npm install

完成所有依赖的安装,然后便可以使用 npm start 启动 Server,并在浏览器中预览或调试了。

另外,在启动时还可以通过 -config 选项指定配置文件名,比如

nokit start 8000 -public=./dist -config=webserver

这样,应用根目录的 config.json 就可以换成 webserver.json 了。

或许,还希望不同的「环境」转发到不同的「地址」,又或者每个开发人员需要不同转发规则,可以通过 -env 指定不同的环境配置,也可以通过「系统环境变量 NODE_ENV」指定,如下

nokit start 8000 -public=./dist -env=local

export NODE_ENV=local

这样,在应用目录可以建立一个 config.local.json 文件,格式和 config.json 相同,nokit 会合并这两个文件,相同的配置节「环境配置文件」将覆盖「默认配置文件」的配置。

最后附上相关模块的 GitHub 地址:

  1. nokitjs https://github.com/nokitjs/nokit
  2. nokit-filter-proxy https://github.com/nokitjs/nokit-filter-proxy

用 Nokitjs 解决前端开发中的跨域问题的更多相关文章

  1. 前端vue开发中的跨域问题解决,以及nginx上线部署。(vue devServer与nginx)

    前言 最近做的一个项目中使用了vue+springboot的前后端分离模式 在前端开发的的时候,使用vue cli3的devServer来解决跨域问题 上线部署则是用的nginx反向代理至后台服务所开 ...

  2. (转)HTML5开发中Access-Control-Allow-Origin跨域问题

    今天准备通过JavaScript的方式调用问说问答的内容,由于使用的不同的二级域名,遇到了一个跨域问题,虽然可以使用JSON或者XML来解决这个问题,但是我们可以通过Access-Control-Al ...

  3. nodejs服务实现反向代理,解决本地开发接口请求跨域问题

    前后端分离项目需要解决第一个问题就是,前端本地开发时如何解决通过ajax请求产生的跨域的问题.一般的做法是通过本地配置nginx反向代理进行处理的,除此之外,还可以通过nodejs来进行代理接口.当然 ...

  4. web开发中浏览器跨域问题

    <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Contro ...

  5. web开发中的跨域整理

    1.springboot通过CROS实现跨域: https://www.cnblogs.com/520playboy/p/7306008.html springboot下各种跨域方式: http:// ...

  6. Nginx解决前端调用后端接口跨域问题

    1.项目中遇到的问题描述: 前端调用zuul统一网关服务接口,请求状态码200,但是无返回数据. 浏览器控制台报错信息:No  Access-Control-Allow-Origin header i ...

  7. Springboot中关于跨域问题的一种解决方法

    前后端分离开发中,跨域问题是很常见的一种问题.本文主要是解决 springboot 项目跨域访问的一种方法,其他 javaweb 项目也可参考. 1.首先要了解什么是跨域 由于前后端分离开发中前端页面 ...

  8. Web前端开发中的MCRV模式(转)

    作者: izujian  来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...

  9. 解决React前端在开发环境的跨域问题

    在前后端分离的分布式架构中,跨域是一道无法绕过去的门槛,众所周知,生产环境上解决跨域最便捷的方式是使用Nginx来处理,那么,在本地开发环境又该如何处理呢? React框架里处理跨域问题,可以使用ht ...

随机推荐

  1. gym101431B

    以此纪念我都快忘了的后缀自动机(捂脸) 不过这题有两种做法: 用后缀自动机,先把原串再接遍中间加入特殊连接字符再把原串反接两遍,对这个新构造出的串做后缀自动机.(或者直接建立广义后缀自动机) 下面只要 ...

  2. 【PAT】1011. A+B和C (15)

    1011. A+B和C (15) 给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测 ...

  3. matplotlib 练习

    官网 vamei的博客还是读了就秒懂,很妙, matplotlib核心剖析 官网翻译也不错,但缺少了 Logarithmic and other nonlinear axis对数等非线性轴  这一模块 ...

  4. NOIP2011 D1 T2选择客栈

    上题目: 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每 ...

  5. Android之 ListView(1)

    ListView是Android中最常用的控件之一. 当有太多数据需要显示的时候,ListView就派上用场了.它允许用户通过滑动手指的方式,将数据滑入滑出界面. 一.最简单的ListView实现 1 ...

  6. cdoj1092-韩爷的梦 (字符串hash)【hash】

    http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limi ...

  7. BZOJ4029 HEOI2015定价

    贪心. 每次将最后一个非零位加一判断即可. 一开始想少了,只关心把最后一位变成5了,其实可以都变的. #include<bits/stdc++.h> using namespace std ...

  8. BZOJ1018 堵塞的交通(线段树)

    题目很好明白,然后实现很神奇.首先如果考虑并查集的话,对于删边和加边操作我们无法同时进行.然后暴力分块的话,复杂度是O(n sqrt n) ,不是很优.于是看了题解,发现了线段树的神奇用途. 我们维护 ...

  9. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  10. hdu 1565 最小割

    黑白染色,源指向白,黑指向汇,容量都是方格中数的大小,相邻的格子白指向黑,容量为oo,然后求一次最小割. 这个割是一个简单割,如果只选择不在割中的点,那么一种割就和一个选数方案一一对应,割的大小就是不 ...