背景

先看三段代码:

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="./index.js" async></script>
</body>
</html>

index.js:

import * as circle from './test';

console.log('圆面积:' + circle.area(4));
console.log('圆周长:' + circle.circumference(14));

test.js:

export function area(radius = 5) {
return Math.PI * radius * radius;
} export function circumference(radius = 5) {
return 2 * Math.PI * radius;
}

使用的是es6的module语法,但是通过file:///E:/PHP/node_test/fileAndHttp/index.html进行打开时浏览器会报一个关于CORS跨域的错误,网上查找的说是浏览器禁止访问本地文件。

检查思路

1. 浏览器版本过低,不支持es6语法。于是升级浏览器至最新(Chrome),但是问题依旧没有解决。

2. 本地不支持module模块,通过:

$ npm install -g es-checker
$ es-checker

检查本地对ES6的支持,发现问题并不在这里

3. 通过bable(在这里就不对bable做叙述了)将ES6语法转化成ES5语法,浏览器依旧报CORS跨域问题。

4. 在外网一段回答中主要到回答者提到http和file,于是思考可能是协议使用错误。最后通过localhost本地服务器进行访问文件,报错消失。

什么是File协议

字面意思:本地文件传输协议

什么是File:

file协议主要用于访问本地计算机中的文件,好比通过Windows的资源管理器中打开文件或者通过右键单击‘打开’一样。

如何使用:

file协议的基本格式如下:

file:///文件路径

比如需要打开E盘下txt目录中的index.txt,那么在资源管理器或者浏览器地址栏中输入:file:///E:/txt/index.txt。用file:///+文件地址,其实等价于文件的地址。即:

file:///C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles52F410/wangdan-se-436963[2].jpg 

等价于:

C:/Users/CLi/AppData/Local/Temp/WindowsLiveWriter1627300719/supfiles52F410/wangdan-se-436963[2].jpg 

URI中问什么本地文件file后面跟三个斜杠?

URI的结构为:

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

如果有host,前面需要加//,因此对于http或https等网络地址来说会写成:

https://blog.csdn.net/lishanleilixin/article/category/7191777

这样看上去很自然。如果是文件的话,文件没有host,所以中间的host部分就不要了,就变成了:

file:///lishanleilixin/article/category/7191777

因为如果没有host的话,第一个[]的内容就不存在了,这种同意的写法有一个标准叫CURIE。

什么是http协议

简介:

http协议是Hyper Text JTransfer Protocol,即超文本阐述协议的缩写。是用来从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传输数据。http协议工作于客户端-服务器架构上,浏览器作为http客户端通过url向http服务器端发送请求,服务器接收到请求后,向客户端发送请求。

HTTP的URL:

http使用统一资源标识符URI来传输数据和建立连接。而URL是一种特殊类型的URI。

https://www.baidu.com/s?wd=csdn&rsv_spt=1&rsv_iqid=0xe20f5fa6000102e9&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=62095104_9_oem_dg&rsv_enter=0&oq=http%25E5%258D%258F%25E8%25AE%25AE&rsv_t=cb7eJrt8QfdumTZWig9t5bWhzpKMGLyic5Ap1V%2BZyjA0%2Bsb90A7ykpqzyVk7WUQpEpUaayWEhYo&rsv_pq=876fe1b90002819e&inputT=496865&rsv_sug3=107&bs=http%E5%8D%8F%E8%AE%AE

完整的URL包含下面几个部分:

协议:该URL的协议部分为“https”,标识网页使用的是https协议,在internet中可以使用多种协议(http,https,ftp等)

域名:一个URL中也可以使用IP作为域名,这个URL中域名为www.baidu.com

端口:跟在域名后,以“:”作为分隔符。如果省略端口,那么将采用默认端口。

虚拟目录:虚拟目录不是必须部分。是从域名后第一个“/”开始到最后一个“/”为止。

文件名:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。

锚:从“#”开始到最后都是锚,锚也不是一个URL必须的部分。

参数:从“?”开始到“#”为止中间为参数,参数可以允许有多个参数,中间以“&”作为分隔符。

请求方法:

GET  请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。

浏览器通过file://访问文件和http://访问文件的区别

file协议用于访问本地计算机中的文件,好比通过资源管理器中打开文件一样,需要主要的是它是针对本地的,即file协议是访问你本机的文件资源。

http访问本地的html文件,相当于将本机作为了一台http服务器,然后通过localhost访问的是你自己电脑上的本地服务器,再通过http服务器去访问你本机的文件资源。

再简单点就是file只是简单请求了本地文件,将其作为一个服务器未解析的静态文件打开。而http是在本地搭建了一个服务器再通过服务器去动态解析拿到文件。

其他区别:

file协议只能在本地访问

本地搭建http服务器开放端口后他人也可以通过http访问到你电脑中的文件,但是file协议做不到

file协议对应有一个类似http的远程访问,就是ftp协议,即文件传输协议。

file协议无法实现跨域

问题解决

开始通过file协议直接访问index.html,在index.html中静态引入index.js,在index.js中import test.js。在import的过程中需要http服务器去解析es6语法并添加header头信息去跨域引入test.js,但是file协议相当于通过资源管理器静态访问index.html,中间的过程没有http服务器参与解析,所以无法识别es6的import语法。

浅谈FIle协议与Http协议及区别的更多相关文章

  1. 浅谈 HTTP中Get与Post的区别

    浅谈 HTTP中Get与Post的区别 存在的误区 有人说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹 ...

  2. 浅谈Nginx负载均衡和F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处 ...

  3. 浅谈Nginx负载均衡与F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道“墙”,将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问 ...

  4. 【转】浅谈Nginx负载均衡与F5的区别

    前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道“墙”,将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问 ...

  5. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  6. 浅谈HTTPS和SSL/TLS协议的背景和基础

    相关背景知识要说清楚HTTPS协议的实现原理,至少要需要如下几个背景知识.大致了解几个基础术语(HTTPS.SSL.TLS)的含义大致了解HTTP和TCP的关系(尤其是"短连接"和 ...

  7. 浅谈 HTTPS 和 SSL/TLS 协议的背景与基础

    来自:编程随想   >> 相关背景知识 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 大致了解 HTTP 和 ...

  8. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  9. 浅谈UART/12C/TTL的定义与区别与解析

    UART/12C/TTL的定义与区别: UART:UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试.主机和从机 ...

随机推荐

  1. Python(多线程threading模块)

    day27 参考:http://www.cnblogs.com/yuanchenqi/articles/5733873.html CPU像一本书,你不阅读的时候,你室友马上阅读,你准备阅读的时候,你室 ...

  2. Good Bye 2017(送命场)

    9815人数场,9500+围观神仙打架...断断续续打Codeforces也快有一年啦,第一次打Good Bye场,满怀前排膜tourist的心愿参加了这场送命场,虽然没看到tourist.不过还是得 ...

  3. vue 学前班002(创建一个实例)

    创建一个Vue实例 我们之前说过,Vue是数据驱动视图的,只要model(模型层)的数据改变了,Vue就会帮我们改变视图上显示的内容,不用我们自己去动手写代码更新.那么,它是怎么做到的,我们的代码要怎 ...

  4. Android之系统Action大全

    String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_AC ...

  5. linux文件系统底层原理

    Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 底层原理图: 在讲解各个 ...

  6. linux安装git,linux安装jenkins

    首先是两个地址,分别是git的版本下载地址,jenkins的下载地址 https://mirrors.edge.kernel.org/pub/software/scm/git/ http://mirr ...

  7. 【lintcode】834. Remove Duplicate Letters

    题目描述: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  8. UIDevice currentDevice model possible values

    NOTE: The below code may not contain all device's string, I'm with other guys are maintaining the sa ...

  9. 剑指offer二十三之二叉搜索树的后序遍历序列

    一.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 二.思路 1.二叉搜索树又称二叉排序树(Binar ...

  10. PHP相关异常

    1. Maximum execution time of 30 seconds exceeded 报错一:内存超限,具体报错语句忘了,简单说一下解决办法 1> 利用循环分批导入: 2> 每 ...