用 Nokitjs 解决前端开发中的跨域问题

问题

在开发一些「单页应用」时,通常会使用 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-...

原文地址:https://www.cnblogs.com/10manongit/p/12640962.html

时间: 2024-08-03 08:14:19

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

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

今天准备通过JavaScript的方式调用问说问答的内容,由于使用的不同的二级域名,遇到了一个跨域问题,虽然可以使用JSON或者XML来解决这个问题,但是我们可以通过Access-Control-Allow-Origin解决跨域问题,下面一起来看看Access-Control-Allow-Origin跨域问题的解决方法. 什么是跨域? 顾名思义,跨域就是不同的域名下的资源访问,会被浏览器的本地安全策略阻止,例如www.uedsc.com去AJAX请求一个wenda.uedsc.com的资源,他们

web开发中浏览器跨域问题

1 <system.webServer> 2 <httpProtocol> 3 <customHeaders> 4 <add name="Access-Control-Allow-Origin" value="*" /> 5 <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" /> 6

前端开发中的Error以及异常捕获

本文首发于公众号:符合预期的CoyPan 写在前面 在前端项目中,由于JavaScript本身是一个弱类型语言,加上浏览器环境的复杂性,网络问题等等,很容易发生错误.做好网页错误监控,不断优化代码,提高代码健壮性是一项很重要的工作.本文将从Error开始,讲到如何捕获页面中的异常.文章较长,细节较多,请耐心观看. 前端开发中的Error JavaScript中的Error JavaScript中,Error是一个构造函数,通过它创建一个错误对象.当运行时错误产生时,Error的实例对象会被抛出.

关于前端开发中的“收口”思想

什么是收口 所谓条条大路通罗马,但如果让我来设计通向罗马的各种大路,我至少会做两件事情: ① 让罗马只有一个入口 ② 让罗马只有一个出口 这样做的好处是,无论你路从哪来,我可以统一在入口处给你打上各种标志,我也可以在你离开罗马时给你留点纪念.当然罗马自然不只一个出口入口,但是每个出口入口一定有一套相同的规定,否则就会出问题. 具体到当今的工作场景,高速公路又是一个收口的好例子,进入高速公路时候得经过收费站做点标志,离开时候也会做点操作,如果没有这种收口,不论是缴费工作,流量统计或者其他都是无法统

ASP.NET中Cookie跨域的问题及解决代码

ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html 最近在项目开发中遇到一个很棘手的问题,一个用户在顶级域名登录后,跳转到自己所拥有的二级域名下管理二级网站时,cookie丢失了,一直找解决办法找了整整两天,百度谷歌一大堆,

解决项目中的跨域操作问题

浏览器存在许多安全策略,其中同源策略就是其中一个,所谓同源策略也叫同域名策略,即只有协议+域名+端口一致的情况下才可以相互访问,其目的就是为了保护用户信息的安全,同源策略现在的范围包括三方面:1).Cookie.LocalStorage.IndexDB无法读取:2).DOM无法获取:3).AJAX请求不能发送.这里主要介绍两种解决AJAX请求不能发送的解决方案:JSONP和CORS.JSONP是一种前端的解决方式:CORS是跨域资源共享,在服务端实现. 一.JSONP 这里使用jquery的$.

前端开发中务必要转义的三处场景

出于这样或那样的原因,我们在传输.存储.展现字符串时需要进行转义操作,防止不可控的事情发生.下面我将分三处场景描述,有的里边确实有坑,希望大家看完后都有所收获.欢迎积极留言补充. 场景1:使用URL 前端开发中,我们经常会使用到URL,比如博客查询的表单action:"http://eastme.me?q=前端".Ajax发送Get\Post请求.跳转至网址:"http://www.eastme.me/个人简介"等等.这些请求的URL经常会出现汉字,尤其是当表单提交

px em rem在WEB前端开发中的区别

我们都知道基于像素的字体大小所用的单位是px,但是随着响应式设计的不断火热,基于相对字体大小的单位em变开始流行起来.当然,rem也在Web前端开发人员讨论如何更好设置字体大小的讨论话题之列.是不是需要用em或者是rem来替换掉px在前端开发中进行使用呢? 为什么我们需要使用相对字体大小呢? 或许我们最能直接想到的一点就是它关于CSS3的一些东西.很好理解的是它是一种字号计算方式,尤其是当你在为多种分辨率进行字号计算的时候.想想要在手机上实现字体变大或者变小的时候,你不得不要反复重新计算对象的字

总结前端开发中的一些特殊规范

前端日子工作太忙没时间发随笔,现在来总结一些前端开发中的特殊规范(常规的规范就不赘述了),希望能让各位收益,也欢迎提出异议. 一. 文件系统 一个有条理的文件系统可以为后期的维护提供便利,起码寻找某个页面的某张图片时不用对着url地址顺藤摸瓜找半天,如果能做到不看url也能准确猜中某页面文件的所在地,那这个文件系统便是合格的. 先来看一个不合格的文件存放方式: 如上图,该目录下共有2个css文件夹.2个js文件夹以及3个存放图片的文件夹(“dyp2p”文件夹里也是放置图片的),同时还有许多人经常