免费 CDN 玩法 —— 文件一键上传到 NPM
前言
unpkg、jsdelivr 等站点可加速 NPM 包文件,适合作为个人网站或演示案例的免费 CDN。
虽然上传文件到 NPM 很简单,创建 package.json
然后 npm publish
即可,但之后更新却很麻烦 —— 即使只更新一个文件,也要发一个新版本的包。由于 URL 包含版本号,因此所有文件的 URL 都会变化,导致无法利用缓存。
当然也可以增量发布,每次只发布变化的文件,从而充分利用已有的文件。但这需记录每个文件的状态,实现起来较为麻烦。
无状态
这里讲解一种更巧妙的方案 —— 使用文件 Hash 作为版本号。
虽然版本号必须是 1.0.0
这种格式,但 semver
允许设置 pre-release
后缀,例如 1.0.0-alpha
。
因此可以将文件 Hash 作为后缀,并且每个包只有一个文件。文件名随意,尽量使用文本格式的扩展名,从而能被 CDN 压缩传输。例如:
https://unpkg.com/free-host@0.0.0-C0LZDygPhSzaVUKy/index.css
这样就不用单独维护每个文件的版本了,所有文件都是 0.0.0 版本。如果存在多个内容相同的文件,它们还可共享同个 URL。
演示
根据上述思路,编写相应的脚本 npm-upload.sh。
使用前登陆 NPM。通过 NPM_PKG
环境变量指定包名:
export NPM_PKG=package_name
例如上传 hello.txt
:
echo "Hello World" > hello.txt
~/npm-upload.sh hello.txt
得到结果:
https://unpkg.com/free-host@0.0.0-0qhPS4tlCTfsj3PN/index.txt
https://cdn.jsdelivr.net/npm/free-host@0.0.0-0qhPS4tlCTfsj3PN/index.txt
可同时上传多个文件。例如上传当前目录下所有文件:
~/npm-upload.sh $(find * -type f)
得益于 Hash 的优势,上传前脚本可检查该文件是否存在,所以内容相同的文件不会重复上传。
应用
如何将网站所有 URL 都映射到 unpkg 或 jsdelivr?一个简单的办法是用 <base>
重置根路径。但这只适用于相对路径,并且一次只能选择一个 CDN。
有没有办法自动选择最快的那个 CDN,并且出现问题后无缝切换到另一个?事实上可通过 Service Worker 实现。案例参考:https://github.com/EtherDream/freecdn/tree/master/examples/free-host
免费 CDN 玩法 —— 文件一键上传到 NPM的更多相关文章
- 文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现
----------------------------------------------------------------------------------------------[版权申明: ...
- 免费 CDN 玩法 —— 将整个网站打包成一个图片文件
资源合并 前端开发者都知道,过多的请求对性能影响很大.而且有些 CDN 不仅按流量收费,请求数也收费,如果网页里有大量小文件,显然不划算. 为此不少开发者将零碎的小文件进行合并优化,例如 JS/CSS ...
- HTML中简单实现文件的一键上传的操作
在html中实现文件上传的方式为form表单中使用input type="file"控件,但是这个控件往往显示不是美观,影响页面效果,这时候,一般就通过一键上传的操作,来实现点击一 ...
- jquery ocupload一键上传文件应用
直接上栗子 这是官方文档栗子 var myUpload = $(element).upload({ name: 'file', action: '', enctype: 'multipart/form ...
- Python 一键上传下载&一键提交文件到SVN入基线工具
一键上传下载&一键提交文件到SVN入基线工具 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用说明 1 注: 根据我司项目规则订制的一套工具,集成以下功能,源码 ...
- 带进度条的文件批量上传插件uploadify
有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另 ...
- 使用ocupload和POI一键上传Excel并解析导入数据库
使用的工具如下: JQuery ocupload jquery.ocupload-1.1.2.js Apache POI poi-3.9.jar 如果是Maven项目添加依赖如下: <depe ...
- js实现文件的上传和输出,拖拽上传图片
js文件上传 文件下载 以前的文件的下载都是在服务器,现在也是放在服务器比较好,有时候为了一些开发的方便,我们临时把处理的数据就放在了本地,然后自己访问.这个也是可以的. 1.利用html5的 Fil ...
- 利用blob对象实现大文件分片上传
首先说分片上传,我们在进行文件上传的时候,因为服务器的限制,会限制每一次上传到服务器的文件大小不会很大,这个时候我们就需要把一个需要上传的文件进行切割,然后分别进行上传到服务器. 假如需要做到这一步, ...
随机推荐
- openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问
准备好工作目录 mkdir work cd work mkdir conf logs 准备好 conf/nginx.conf 配置文件, 把 your.domain 换成你自己的域名 user abc ...
- Redis-技术专区-让你彻底会使用“Redis中最陌生且最强大的集合”(ZSET)【前篇】
前言介绍 很多小伙伴都跟我说,redis中,ZSet(有序集合)是他们最陌生的集合,同时也是觉得特别复杂的集合之一,在开发过程中经常会用到它,而且也是大家最不太有把握使用的集合,所以笔者就从ZSet集 ...
- TDSQL(MySQL版)之DB组件升级
随着数据库产品的更新迭代,修复bug等等,产品避免不了会出现升级的需求.TDSQL(MysqL版)也会有这方面的需求.接下来我就说说如何对现有TDSQL(MySQL版)集群组件进行升级,而不影响业务. ...
- LinkedList 添加元素源码解析
jdk版本:1.8 LinkedList添加元素有两个方法:add(E e)和add(int index,E e). add(E e) /** * Appends the specified elem ...
- 部署MySQL主主复制管理器
一.概念 MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序.MMM 使用 Per ...
- Anaconda配置国内镜像源
1. 为conda配置(清华)镜像源 使用conda进行安装时,访问的是国外的网络,所以下载和安装包时会特别慢.我们需要更换到国内镜像源地址,这里我更换到国内的清华大学地址.(永久添加镜像) Wind ...
- POJ1741——Tree(树的点分治)
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2013-11-17 1 ...
- 学习PHP中的任意精度扩展函数
今天来学习的是关于数学方面的第一个扩展.对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最基础最根本的东西之一.不管你是学得什么专业,到最后基本上都会要学 ...
- 一起学习PHP中断言函数的使用
原来一直以为断言相关的函数是 PHPUnit 这些单元测试组件提供的,在阅读手册后才发现,这个 assert() 断言函数是 PHP 本身就自带的一个函数.也就是说,我们在代码中进行简单的测试的时候是 ...
- TP5框架下实现数据库的备份功能-tp5er/tp5-databackup
1.安装扩展 方法一: composer require tp5er/tp5-databackup dev-master 方法二 composer.json: "require": ...