1.curl 的自动自动用法指南
2.sourcemap的认知与运用
3.别人的网页,通过页面查看源代码复制源代码到dreamwaver想用这个框架改成自己的跟随跟随网页,能够替换吗?
4.Linux入门之curl指令详解
5.Vue2 源码解析
curl 的源码用法指南
curl 是一种常用的命令行工具,主要用于请求 Web 服务器。代码其名称来源于客户端(client)的自动自动 URL 工具。curl 功能强大,跟随跟随简洁网页源码拥有多种命令行参数,源码熟练使用后可完全替代图形界面工具如 Postman。代码
本文将介绍 curl 的自动自动主要命令行参数,以便于日常查阅。跟随跟随内容主要翻译自《curl cookbook》。源码为了节省篇幅,代码以下示例不包括运行时的自动自动输出,初学者可以先参考《curl 初学者教程》。跟随跟随
不带有任何参数时,源码curl 会发出 GET 请求。例如,向 发出 GET 请求,服务器返回的内容会在命令行输出。
-A 参数用于指定客户端的用户代理标头,即 User-Agent。curl 的默认用户代理字符串是 curl/[version]。例如,将 User-Agent 改为 Chrome 浏览器。
-b 参数用于向服务器发送 Cookie。例如,生成一个标头 Cookie: foo=bar,向服务器发送一个名为 foo、值为 bar 的 Cookie。
-c 参数将服务器设置的 Cookie 写入一个文件。例如,将服务器的 HTTP 回应所设置的 Cookie 写入文本文件 cookies.txt。
-d 参数用于发送 POST 请求的数据体。使用 -d 参数后,xp源码文件结构HTTP 请求会自动加上标头 Content-Type: application/x-www-form-urlencoded,并将请求转为 POST 方法,因此可以省略 -X POST。
--data-urlencode 参数等同于 -d,用于发送 POST 请求的数据体,区别在于会自动将发送的数据进行 URL 编码。
-e 参数用于设置 HTTP 的标头 Referer,表示请求的来源。例如,将 Referer 标头设为 google.com?q=example。
-F 参数用于向服务器上传二进制文件。例如,给 HTTP 请求加上标头 Content-Type: multipart/form-data,然后将文件 photo.png 作为 file 字段上传。
-G 参数用于构造 URL 的查询字符串。例如,发出一个 GET 请求,实际请求的 URL 为 google.com/search?...
-H 参数添加 HTTP 请求的标头。例如,添加 HTTP 标头 Accept-Language: en-US。
-i 参数打印出服务器回应的 HTTP 标头。例如,收到服务器回应后,先输出服务器回应的标头,然后空一行,再输出网页的源码。
-I 参数向服务器发出 HEAD 请求,然后打印出服务器返回的 HTTP 标头。
-k 参数指定跳过 SSL 检测。例如,不检查服务器的 SSL 证书是否正确。
-L 参数让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。语言背后的源码
--limit-rate 用于限制 HTTP 请求和回应的带宽,模拟慢网速的环境。
-o 参数将服务器的回应保存成文件,等同于 wget 命令。
-O 参数将服务器回应保存成文件,并将 URL 的最后部分当作文件名。
-s 参数将不输出错误和进度信息。
-S 参数指定只输出错误信息,通常与 -s 一起使用。
-u 参数用于设置服务器认证的用户名和密码。
-v 参数输出通信的整个过程,用于调试。
-x 参数指定 HTTP 请求的代理。
-X 参数指定 HTTP 请求的方法。
sourcemap的认知与运用
在讨论sourcemap之前,我们首先需要了解编程语言的编译过程。
编译是将编程语言转换为可执行代码的过程。然而,可执行代码和源代码是完全不同的两种格式。如果在执行过程中出现错误,很难定位源代码编写过程中出现的问题。因此,现代编译器基本上都支持一种标准的可执行代码与源代码之间的映射,以特定格式将这种映射关系持久化存储到文件中。当程序执行出现问题时,根据堆栈信息使用映射文件逆向还原到源代码,可以清晰地、语义化地查找编写过程中的错误。
在常见的C Family languages中,这种可执行代码和源码之间映射的格式已经是一种标准化的东西了,称为DWARF。尽管在每个厂商应用的平台上产生的文件格式不尽相同,但它们内里遵循的店铺货源码数映射格式都遵循了DWARF调试标准。
回到Web前端领域讨论这个问题,类似地,我们有sourcemap这个东西。或者我们应该称它为sourcemap调试格式标准。因为目前我们对sourcemap的格式都遵循了一定的标准,但在它的用途上,却出现了千差万别。
本文中讨论sourcemap的格式组成是没有意义的,sourcemap的格式应当是一种持续发展的标准,每当标准更新,自然会有健壮的工具帮助解读。理解sourcemap的格式对它的应用不会有太明显的帮助。
按照我的理解,最早sourcemap是为了协助JavaScript代码混淆(或者压缩)而产生的。框架的作者为了缩小代码体积、避免生产环境的JavaScript代码能被轻松地阅读,使用压缩、混淆工具对源码进行了处理。如果产生了问题,有sourcemap还能轻松地还原代码。但当时的sourcemap并不是web标准之一,这为今日的web前端工程化体系埋下了隐患。
在上一节中提到,sourcemap是一种“可执行代码”和源码之间的映射关系,那么只要是产生编译的地方,就应该会有sourcemap产生。
首先想到了Babel这个工具,它是应用最广泛的JavaScript编译器,接下来我们尝试一个示例:
接着,我们安装babel,指定sourcemap参数为inline,并对其进行转换,得到:
可以看到,超市导购系统源码转换后的代码和源码产生了很大的区别,并且sourcemap以注释的形式紧跟在可执行代码尾部,它的链接指向了一个data URL。
这么看就很容易了解到,sourcemap是一个基于之前的web标准拓展的功能,它只需要以固定的注释格式跟随在一个脚本文件的末尾即可。那么不同的浏览器厂商想要兼容这个标准,只需要加以识别这个格式即可。
但上文可以看出,data URL加在注释中,任何外部人员都可以轻易获得。因此在做代码转换时,可以将sourcemap生成到一个单独的文件中,一般是文件名加.map后缀,那么对应的sourcemap的地址也就变成:
sourcemap的这种设计方法并不是独一份的。例如在C Family Language的构建交付体系中,为了调试方便,对于测试环境交付的库、可执行代码,并不会将它们的"sourcemap"从可执行代码中分离出来。它们的执行环境和大部分JavaScript引擎一样,在调试断点或者Exception时,都能自动地载入"sourcemap"并且给出对应的源码栈信息。而在生产交付时,都会在构建时将"sourcemap"从库和可执行文件中提取出来单独保存。这样既减小了交付的产物体积,还能保证源码信息不被外部人员知晓。
既然sourcemap在逐渐地成为一个标准,那么自然就有配套的标准工具对这种格式进行解析。除了Chrome devtools自带的以外,还可以使用常见的库,接下来我们使用mozilla的source-map库,对刚才的代码进行一些还原的操作。
这是断点调试常见经常会碰到的场景,比如某个exception发生在了我们刚才代码的line 9; column 2; 即console.log的位置。那么我们可以这么做:
通过载入map文件,然后查找line 9 column 2对应的源代码位置可得:
然后我们去index.ts中的3行2列,正好是ts文件中的console.log
可以看到,sourcemap不仅记录了代码行列数,还记录了源文件的位置,那么不用翻sourcemap的manual也能说明,sourcemap也像其他编译系统一样,支持多个文件、库的代码映射的集成合并。这对于大型工程的构建十分有用,大型工程往往由数以千计万计的库和代码文件组成,在这种复杂的构建中,我们往往只想要获得有限几个产物。除了可执行代码,sourcemap的统一产出也有利于我们方便地追溯生产环境的问题。
mozilla的source-map标准库不止有查找映射位置的这个作用,更能直接还原代码。我们可以直接载入一个sourcemap文件,然后查看它对应了那些源代码文件,然后根据这些文件进行逐个还原内容:
由于我们只有一个,得到的输出是
在实际开发场景中,我们碰到的sourcemap运用比上面提到的情况复杂得多,但是问题又没有办法一一枚举,所以这里讨论一些常见的例子
前面就见过两种形式:dataURL放在JavaScript文件结尾的、和独立写入文件的。他们的形式是显而易见的,并且特点也能清楚地看出来。前者内联,增大了体积,但是降低了使用的门槛。后者独立,可以隐藏保存起来,非必要时不使用。
但在webpack这种打包构建工具中,对sourcemap做了更多更详细的定义,其基本分类的依据也遵循以下几个维度:
具体的规则可以翻阅webpack对应的文档,光靠脑子记是没办法的。
对库、预编译/转换的sourcemap处理
日常开发中,使用库或者预编译的组件是很常见的事,例如:
预编译文件的处理
像这些场景对工程的构建提出了比较多的要求。这里就针对常用的webpack做一个处理的展示,还是以前面的工程为例,我们的Typescript库导出了函数a,然后我们直接引用dist/index.js(而非src/index.ts)
然后我们通过webpack打包并且导出它的sourcemap
最后我们得到了./dist/demo.dist.js.map(名字有点诡异哈)
然后我们再通过刚才写的sourcemap工具进行还原看看:
可以看到,webpack默认情况下可以识别预编译的文件它的sourcemap,并且进行合理的目录转换,保证指向正确
那么我们如果删除预编译文件的sourcemap呢?我对a函数的库重新编译了一遍,并且不导出任何sourcemap,结果对引入的a函数库的文件还原就变成了
库的处理
如果a函数是从npm库引用的呢?我尝试了下把函数a放到了库中,然后将源码引用改成了
结果虽然node_modules中带了sourcemap,但是还原后并不是原本的ts代码
这时候需要对webpack进行配置,增加source-map-loader作为预处理,且不能排除node_modules目录:
然后再进行打包编译出来的map我们对其进行还原发现:
webpack成功帮我们提取了node_modules库中的sourcemap
本文主要阐述了sourcemap的基本知识,包含了几个方面:
别人的网页,通过页面查看源代码复制源代码到dreamwaver想用这个框架改成自己的网页,能够替换吗?
不是很靠谱的,现在网页设计的理念,基本是内容与表现分离,表现部分基本都在css里,你只复制页面代码,显然很多地方改不了,靠谱的方法是把这个网页所有的相关资源都下载下来(通常用浏览器的 文件->保存 即可,样式表等相关资源会自动跟随到相关目录的),然后dw打开网页,再配合ps,慢慢改即可。
Linux入门之curl指令详解
在Linux系统中,网络通信是一项基本而重要的技能。curl是一个功能强大的命令行工具,用于数据传输。它支持多种协议,包括HTTP、HTTPS、FTP等,使得从命令行与网络服务交互变得简单快捷。本文将详细介绍curl的基本用法和一些高级特性,帮助Linux初学者快速上手。
curl的基本语法非常简单:
其中,[options]是可选的参数,用于定制curl的行为,[URL...]是一个或多个要访问的URL地址。
要获取一个网页的内容,可以直接使用curl命令后跟URL:
这将输出网页的HTML源码。
如果希望将网页内容保存到本地文件中,可以使用-O选项:
这会将内容保存到名为example.com的文件中。如果URL最后包含斜杠(/),则会保存到名为index.html的文件中。
使用-o选项可以指定保存文件的名称:
这样,网页内容就会被保存到mypage.html文件中。
curl提供了许多选项来满足不同的需求。
默认情况下,curl不会跟随服务器的重定向。使用-L选项可以让curl自动跟随重定向:
用户代理可以通过使用-A选项设置,模拟不同的浏览器访问:
如果需要通过代理服务器访问网络,可以使用-x选项:
curl默认会验证SSL证书。如果希望忽略证书验证,可以使用-k或--insecure选项:
curl可以用于提交表单数据。使用-d选项可以发送POST请求:
curl也可以用于文件上传。使用-F选项可以指定要上传的文件:
其中@表示文件路径,localfile.txt是要上传的本地文件名。
curl的高级用法可以帮助用户完成更复杂的任务。
curl可以保存服务器返回的Cookie,并在后续请求中使用。使用-b选项保存Cookie,使用-c选项读取Cookie:
对于文件上传等操作,可以使用-F选项的多部分表单数据格式:
通过-H选项添加自定义的请求头:
curl支持断点续传功能,可以使用-C选项继续未完成的下载:
如果服务器支持断点续传,curl会自动从上次中断的地方开始下载。
curl是一个功能丰富的工具,适合Linux用户进行网络数据传输和自动化脚本编写。通过掌握上述基本用法和高级特性,用户可以更加高效地与网络服务交互。随着实践的深入,用户会发现curl在处理网络请求方面的潜力无限。
Vue2 源码解析
Vue.js,作为前端开发中的知名框架,其核心机制在于数据的自动监测和响应式更新。阅读源码有助于理解其工作原理,尤其是依赖收集、数据监听和模板编译的过程。1. 依赖收集与数据监听
Vue 通过getter和setter机制监控数据变化,确保DOM的自动更新。数据变更时,Vue 会区分"推送"与"拉取"策略。"推送"用于像data和watch这样的直接访问,当数据变化时主动通知依赖;而"拉取"策略在计算属性或methods中使用,依赖会自动跟随数据变化更新。 核心方法如defineReactive(),在实例初始化时将data转换为可响应的getter和setter,收集依赖关系。Watcher负责在数据变化时执行相应的逻辑。2. 模板编译与渲染
Vue 通过render()方法将模板编译为AST并优化为虚拟DOM,然后在挂载时调用$mount()进行渲染。在web平台上,$mount会调用mountComponent(),处理初次渲染和更新的差异。3. 组件机制
Vue组件解析是通过webpack等工具将.vue文件转换为JS,组件拥有独立的Vue实例,独立渲染。v-model双向绑定在1.0和2.0中有所变化,2.0版本下,它本质上是:value绑定和事件绑定的结合。4. 实现细节
例如,nextTick()方法处理异步更新DOM的问题,确保在DOM更新后执行回调。Vue-router关注更新URL和监听URL变更,使用history模式解决hash模式的局限。5. 周边技术
vue-router在前端路由中处理URL更新和监听,而Vuex用于状态管理,提供了一个状态统一存储和分发的解决方案。vue-cli是Vue的命令行工具,用于项目初始化和管理。