大音希声,大象无形,大智若愚,大巧若拙,越是“简单”的货色,其原理越趋势“简略”,大道至简,繁在人心。
咱们都晓得,npm 是 JavaScript 世界的包管理工具,并且是 Node.js 平台的默认包管理工具。通过 npm 能够装置、共享、散发代码,治理我的项目依赖关系。尽管作为命令行工具的 npm 近年来逐步式微,然而作为宽泛应用的存储库的 npm,却仍然如日中天,还是世界上最大的软件注册表。
通常,咱们通过npm install xxx
在 React、Vue、Angular 等古代前端我的项目中装置依赖,然而前端我的项目在实质上还是运行在浏览器端的 HTML、JavaScript 和 CSS,那么,咱们有方法在浏览器控制台间接装置 npm 包并应用吗?
如果你对这个问题感兴趣,无妨跟着我通过本文一探到底,兴许最终你会发现:越是“简单”的货色,其原理越趋势“简略”。
通过 <script />
引入 cdn 资源
在浏览器控制台装置 npm 包,看起来是个天马行空的想法,让人感觉不太切实际。如果我换一个形式进行发问:如何在浏览器/HTML 中引入 JavaScript 呢?兴许你马上就有了答案:<script />
标签。没错,咱们的第一步就是通过 <script />
标签在 HTML 页面上引入 cdn 资源。
那么,又该如果在控制台在页面上插入<script />
标签来引入 CDN 资源呢?这个问题可难不倒你:
// 在页面中插入<script />标签const injectScript = (url) => { const script = document.createElement('script'); script.src = url; document.body.appendChild(script);};
咱们还得在资源引入后以及呈现谬误时,给用户一些提醒:
script.onload = () => { console.log(pkg_name_origin, ' 装置胜利。');};script.onerror = () => { console.log(pkg_name_origin, ' 装置失败。');};
这么以来,咱们就能够间接在控制台引入 cdn 资源了,你能够再额定补充一些善后工作的解决逻辑,比方把<script />
标签移除。当然,你也齐全能够通过创立<link />
标签来引入css款式库,这里不过多赘述。
依据包名装置 npm 包
下面实现了通过<script />
引入 cdn 资源,然而咱们装置 npm 包个别都是通过npm install
前面间接跟包名来实现的,显然单靠<script />
的形式难以达到咱们的饿预期,那么,有没有一种形式,能够将咱们的包名间接转换成 cdn 资源地址呢?
答案当然是:有。否则我写个屁啊 ,cdnjs
就提供了这样的能力。
cdnjs 提供了一个简略的 API,容许任何人疾速查问 CDN 上的资源。具体应用读者可参考官网链接,这里给出一个依据包名查问 CDN 资源链接的示例,能够间接在浏览器地址栏关上这个链接查看:https://api.cdnjs.com/libraries?search=jquery
,这是一个 get 申请,你将看到相似上面的页面,数组的第一项为名称/性能最相近的资源的最新 CDN 资源地址:
是以,依据包名搜寻 cdn 资源 URL 便有如下的实现:
const cdnjs = async (name) => { const searchPromise = await fetch( `https://api.cdnjs.com/libraries?search=${name}`, // 不显示referrer的任何信息在申请头中 { referrerPolicy: 'no-referrer' } ); const { results, total } = await searchPromise.json(); if (total === 0) { console.error('Sorry, ', name, ' not found, please try another keyword.'); return; } // 取后果中最相干的一条 const { name: exactName, latest: url } = results[0]; if (name !== exactName) { // 如果名称和你传进来的不一样 console.log(name, ' not found, import ', exactName, ' instead.'); } // 通过<script />标签插入 injectScript(url);};
装置特定版本的 npm 包
咱们在 npm 中还能够通过相似npm install jquery@3.5.1
的语法装置特定版本的 npm 包,而 cdnjs 只能返回特定版本的详细信息(不含 cdn 资源链接)。
UNPKG在此时能够帮咱们一个大忙。unpkg 是一个疾速的寰球内容散发网络,实用于 npm 上的所有内容。应用它能够应用以下 URL 疾速轻松地从任何包加载任何文件:unpkg.com/:package@:version/:file
。
例如,拜访https://unpkg.com/jquery@3.5.1
会主动重定向到https://unpkg.com/jquery@3.5.1/dist/jquery.js
,并返回v3.5.1
版本的jQuery
文件内容(如果不带版本号,会返回最新的资源):
也就是说,咱们能够将https://unpkg.com/
➕包名
间接丢给<script />
标签来加载资源:
const unpkg = (name) => { injectScript(`https://unpkg.com/${name}`);};
残缺代码
将下面的代码简略整顿,并通过一个对立的入口办法npmInstall
进行调用:
// 存储原始传入的名称let pkg_name_origin = null;const npmInstall = (originName) => { // Trim string const name = originName.trim(); pkg_name_origin = name; // 三种引入形式 // 如果是一个无效的URL,间接通过<script />标签插入 if (/^https?:\/\//.test(name)) return injectScript(name); // 如果指定了版本,尝试应用unpkg加载 if (name.indexOf('@') !== -1) return unpkg(name); // 否则,尝试应用cdnjs搜寻 return cdnjs(name);};// 在页面中插入<script />标签const injectScript = (url) => { const script = document.createElement('script'); script.src = url; script.onload = () => { console.log(pkg_name_origin, ' 装置胜利。'); }; script.onerror = () => { console.log(pkg_name_origin, ' 装置失败。'); }; document.body.appendChild(script); // document.body.removeChild(script);};const unpkg = (name) => { injectScript(`https://unpkg.com/${name}`);};const cdnjs = async (name) => { const searchPromise = await fetch( `https://api.cdnjs.com/libraries?search=${name}`, // 不显示referrer的任何信息在申请头中 { referrerPolicy: 'no-referrer' } ); const { results, total } = await searchPromise.json(); if (total === 0) { console.error('Sorry, ', name, ' not found, please try another keyword.'); return; } // 取后果中最新的一条 const { name: exactName, latest: url } = results[0]; if (name !== exactName) { console.log(name, ' not found, import ', exactName, ' instead.'); } // 通过<script />标签插入 injectScript(url);};
咱们能够应用相似npmInstall('moment')
的形式在控制台进行调用:
上面这些调用形式天然也是反对的:
npmInstall('jquery'); // 间接引入npmInstall('jquery@2'); // 指定版本npmInstall('https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'); // cdn地址
不每次都写这些函数行不行
看了下面的操作,的确很简略,然而兴许你会说:每次要应用时,我都得在控制台定义和调用函数,有些麻烦,不每次都写这些函数行不行?那天然是行的啦,你齐全能够本人写一个浏览器插件,将这些JS代码注入页面,详情可参考7分钟学会写一个浏览器插件——冲破某SDN未登录禁止复制的限度{:target='_blank'}。
如果你切实不想写,其实有人曾经为你写好了,那便是Console Importer
,它能够让你的浏览器控制台成为更弱小的实验场。
- 应用示例:
- 效果图:
链接:Console Importer | Chrome 插件地址
能够干什么
那么,本文介绍的办法和工具到底有什么用呢?
平时开发中,咱们常常会想要在我的项目里尝试一些操作或者验证一些库的办法、打印后果,通过本文的学习,当前你齐全能够间接在控制台引入loadsh、moment、jQuery、React
等来进行应用和验证,缩小在我的项目中进行console.log
验证后再删除的频次。
- 你能够通过引入
jQuery
不便的进行一些我的项目、页面中的DOM操作; - 你能够通过引入
axios
进行一些简略的接口申请; - 你能够通过引入
moment.js
来验证一些工夫格式化办法的应用; - 你能够通过引入
loadsh
并调用它的办法实现一些便捷的计算; - ...
能够学到什么
unpkg
unpkg 是一个内容源自 npm 的前端罕用寰球疾速 CDN,它能以疾速、简洁、优雅的形式提供任意包、任意文件的拜访,在风行的类库、框架文档中经常能看到它的身影。应用形式个别是unpkg.com/:package@:version/:file
。或者更简洁一点:https://unpkg.com/
➕包名
,包名蕴含版本号时,你将取得对应版本的js文件,不蕴含版本号时,你将取得这个库的最新版js文件。
cdnjs
cdnjs{:target='_blank'} 是一种收费的开源 CDN 服务,受到超过 12.5% 的网站的信赖,每月解决超过 2000 亿次申请,由 Cloudflare 提供反对。它相似 Google CDN 和微软CDN服务,然而速度比这二者更放慢。CDNJS 上提供了泛滥 JavaScript 库,你能够间接在网页上援用这些 JS 文件,实现用户浏览网站的最佳速度体验。
你还能够通过它的查问APIhttps://api.cdnjs.com/libraries?search=xxx
进行特定库的cdn地址的查找,这个API还会给你返回一些你所查问的库的替代品。
大道至简,繁在人心
越是“简单”的货色,其原理兴许越是趋势“简略”,大道至简,繁在人心,祝每一个致力攀登者,终能恍然大悟,释然于心。
参考资料
- Console Importer
本文首发于集体博客),欢送斧正和star。