Skip to content

lei-mu/build-cdn-from-cdnjs

Repository files navigation

build-cdn-from-cdnjs

基于cdnjs open api 快速构建自己的前端资源cdn库

  • 无需后端服务
  • 无服务器压力,可使用对象云储存
  • 少量配置修改即可快速搭建私有的 cdn库
  • 自适应网站

视频演示:

demo.mp4

demo.gif

原理

cdn库: 如阿里的oss,华为的obs,腾讯的cos,七牛等等的对象储存,开启cdn 加速,即可成为一个cdn 前端资源库

所有的api 都基于 cdnjs

  • 搜索索引
  • 搜索结果列表
  • 搜索结果详情
  • 搜索结果资源列表

只需要在需要使用对应资源时,通过同步,同步到自己的cdn库,使用自己的cdn 资源。这样,我们仅仅使用了小量空间,就拥有所有前端开源库资源。

同步:将资源上传到自己的cdn库

代码里提供了oss 前端直传和七牛云后端上传示例

判断自己的cdn库是否有对应资源: 通过head 请求,获取自己cdn库的url 判断。

这样一套下来,压力全在云上,自己只需要提供前端项目展示即可,可考虑github pages,gitee pages 或者放在对象储存库里也科技

配置

暴露所需方法

// src/utils/cdn.js
/**
 * oss,qiniu
 * */
// import { checkAllFiles, checkFile, fileSynchronization, cdnDomain, cdnFileFolder, copyScript, copyURL } from './oss'
import { checkAllFiles, checkFile, fileSynchronization, cdnDomain, cdnFileFolder, copyScript, copyURL } from './qiniu'

export default {
  checkAllFile: checkAllFiles,
  checkFile: checkFile,
  copyHtml: copyScript,
  copyURL: copyURL,
  fileSynchronization: fileSynchronization,
  cdnDomain: cdnDomain,
  cdnFileFolder: cdnFileFolder,
  concurrency: 10
}

checkAllFile/checkFile

二选一,只需要提供其中一个即可,优先使用checkAllFile

checkAllFile

批量检测资源是否在自己的cdn库

checkAllFile 接收一个数组,格式示例如下

[{
    name: '库名称', 
    version: '库版本', 
    path: '资源相对路径'
}]

checkAllFile 必须返回返回一个promise,查询完成必须返回所有条数的数组。

格式如下,

[{
    key: '资源相对路径', 
    status: 'yes/no/fail; yes 自己的cdn 服务器存在该文件; no 自己的cdn 服务器不存在该文件;fail 查询自己的服务器是否存在失败'
}]

checkFile

单个检测资源是否在自己的cdn库

checkFile接收一个对象,格式示例如下

{
    name: '库名称', 
    version: '库版本', 
    path: '资源相对路径'
}

checkFile 必须返回一个promise,查询完成返回一个对象,格式如下

{
    key: '资源相对路径', 
    status: 'yes/no/fail; yes 自己的cdn 服务器存在该文件; no 自己的cdn 服务器不存在该文件;fail 查询自己的服务器是否存在失败'
}

copyHtml

自定义复制html 标签方法。有默认,没有自定义要求可以不提供

接收2个参数

  • itemData 当前资源数据
  • copyStr 复制方法
export const coptHtml = (itemData , copyStr) => {
	copyStr(data.sri)
}

copyURL

自定义复制资源url 方法。有默认,没有自定义要求可以不提供

接收2个参数

  • itemData 当前资源数据
  • copyStr 复制方法
export const coptHtml = (itemData , copyStr) => {
	copyStr(data.sri)
}

fileSynchronization

同步资源方法,必须返回一个promise

接收2个参数

  • itemData 当前条资源数据
  • itemData.fullURL: cdnjs 里对应资源的绝对路径
  • itemData.packageName: 资源name
  • itemData.version: 资源版本号
  • itemData.key: 资源路径
  • handle: 方法对象
  • handle.onProgress 上传进度回调,接收一个数字 0 - 100;

同步完成,接收一个对象

{
	key: '资源相对路径'
}

cdnDomain

私有cdn 的域名

export const cdnDomain = 'https://cdnjs.static.cdn.cn'

cdnFileFolder

私有cdn 库的文件夹

如在根路径就写/,固定文件夹如下:

export const cdnFileFolder = '/ajax/libs/'

concurrency

单个检测资源时的最大并行数量

concurrency = 10

常见问题

如何同步资源到自己的cdn 库

由于前端资源不可信原则,建议通过后端上传资源。并且后端必须自己拼接资源的url,只接收version,key,packageName 即可,保证资源的安全。

如何检测资源是否存在于自己的cdn库

通过head 请求,获取自己cdn库的url 判断

license

MIT

须保留底部的cdnjsbuild cdn from cdnjs项目版权声明

感谢cdnjs 提供的open api

About

基于cdnjs open api快速构建自己的前端资源静态库

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published