游戏攻略网
当前位置: 首页 游戏攻略

在浏览器控制台安装npm包是什么操作(在浏览器控制台安装npm包是什么操作)

时间:2023-05-24 作者: 小编 阅读量: 3 栏目名: 游戏攻略

在浏览器控制台安装npm包是什么操作大音希声,大象无形,大智若愚,大巧若拙,越是“复杂”的东西,其原理越趋向“简单”,大道至简,繁在人心原文来自:https://segmentfault.com/a/1190000040875211?_。

大音希声,大象无形,大智若愚,大巧若拙,越是“复杂”的东西,其原理越趋向“简单”,大道至简,繁在人心。

原文来自: https://segmentfault.com/a/1190000040875211?_ea=195828493

我们都知道,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 stringconst 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未登录禁止复制的限制。

如果你实在不想写,其实有人已经为你写好了,那便是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是一种免费的开源 CDN 服务,受到超过 12.5% 的网站的信任,每月处理超过 2000 亿次请求,由 Cloudflare 提供支持。它类似 Google CDN 和微软CDN服务,但是速度比这二者更加快。CDNJS 上提供了众多 JavaScript 库,你可以直接在网页上引用这些 JS 文件,实现用户浏览网站的最佳速度体验。

你还可以通过它的查询APIhttps://api.cdnjs.com/libraries?search=xxx进行特定库的cdn地址的查找,这个API还会给你返回一些你所查询的库的替代品

大道至简,繁在人心

越是“复杂”的东西,其原理也许越是趋向“简单”,大道至简,繁在人心,祝每一个努力攀登者,终能豁然开朗,释然于心。

参考资料
  • Console Importer
    推荐阅读
  • 贾岛经典诗40首(大唐诗人贾岛经典五言诗作)

    题李凝幽居唐代:贾岛闲居少邻并,草径入荒园。寻隐者不遇唐代:贾岛松下问童子,言师采药去。剑客/述剑唐代:贾岛十年磨一剑,霜刃未曾试。忆江上吴处士唐代:贾岛闽国扬帆去,蟾蜍亏复圆。樵人归白屋,寒日下危峰。送无可上人唐代:贾岛圭峰霁色新,送此草堂人。麈尾同离寺,蛩鸣暂别亲。

  • 兴化方言小伙子怎么说(放屁用手揞wǎn)

    我们把一只手掌向上弯曲称为“碗”,把两只手掌并在一起向上弯曲也称为“碗”。用“放屁用手揞”形容这些弱智的措施虽有不雅之嫌,但却大有解气之妙。支书又重新物色了一位“李铁梅”,把女知青安排回南京过春节。兴化水田多,农人的许多农活都是在湴田的过程中完成的。湴河无疑是艰难的、危险的。对湴河的这种理解,在泰州人中是很普遍的。大队革委会给他戴了一顶破坏集体财产的帽子,要他接受群众的批判。

  • 半夜睡觉感觉抖是长个吗(为什么睡觉时身体会突然)

    当身体中的血钙低时,确实会导致肌肉、神经兴奋性亢进,从而引起痉挛抽搐。正确的睡姿可以有效减少临睡肌抽跃症的发生,一般情况下,多数人适宜以右侧卧位为宜。

  • 韩式酸菜怎么做(做泡菜的方法)

    韩式酸菜怎么做大白菜1.5kg、苹果个、梨1个、辣椒面150g、糯米粉50g、蒜50g、姜50g、盐50g。在盆内均匀的给白菜撒上盐,腌制12小时。苹果、梨去皮、去核,分别在榨汁机中打成汁备用。姜、蒜切末备用,小锅内倒入糯米粉。倒入苹果汁、梨汁,用中火熬成糊状。糯米糊放凉后,加入辣椒面、姜末、蒜末、搅拌均匀。腌好的白菜,挤去水分。将泡菜放入无油、无水的密封容器里,再放入冰箱,发酵3-5天即可。

  • 什么是什么什么什么的家(什么是什么什么什么的家举例)

    下面希望有你要的答案,我们一起来看看吧!什么是什么什么什么的家草丛是蟋蟀的家。大树是鸟儿的家。池塘是青蛙的家。大海是鲨鱼的家。森林是老虎的家。天空是星星的家。大地是小草的家。沙漠是骆驼的家。云朵是大雨的家。草原是羊儿的家。

  • 早上起床为什么水肿(早上起来水肿的原因)

    早上起床为什么水肿?我们一起去了解并探讨一下这个问题吧!建议患者可以到医院进行肾脏B超的检查,以及肾功能的相关检查可以明确诊断。第二种是由于心脏疾病引起来的,心脏疾病就会引起心功能不全,会导致心功能的心脏回血受限,引起患者体内血液淤积,从而导致局部出现水肿的现象,建议患者到医院检查,比如说心电图、心脏彩超、心肌酶谱等相关检查,如果发现是心脏疾病引起来的,建议及时进行相关治疗,避免引起严重的并发症。

  • 南京生育险最迟多久去办理 南京生育险多久可以拿到

    用人单位应当自用工之日起三十日内为其职工向社会保险经办机构申请办理社会保险登记。南京用人单位少报、漏报缴费基数怎么办拓展阅读:用人单位职工缴费基数如何确定?南京五项社会保险采用统一的缴费基数。职工当年度缴费基数为本人上一自然年度月平均工资收入。对职工工资收入超过缴费基数上限的,超过部分不计入缴费基数;对职工工资收入低于缴费基数下限的,按下限确定缴费基数。

  • 天猫超市怎么兑换超市卡(天猫超市卡怎么变现成现金)

    天猫超市卡/享淘卡有50面值,100面值,200面值,300面值,500面值,600面值,1000面值。因此我们在去购物的时候,都是有很多人在去进行使用的。但是现在我们的购物卡还有了另外的处理方式,我们可以将我们手上的购物卡去进行回收,京回收平台就是我们现在去进行回收平台,回收的速度快,价格还很高。

  • 承包方式一般有哪三种(承包方式都有哪三种介绍)

    工程总承包的具体方式、工作内容和责任等,由业主与工程总承包企业在合同中约定。对于一些工程较大的项目,发包人可能分别与几个勘察人、设计人、施工人分别签订若干份独立的勘察合同、设计合同、施工合同,各承包人各自独立完成承包工作。联合承包《建筑法》第二十七条第一款规定:“大型建筑工程或者结构复杂的建筑工程,可以由两个以上的承包单位联合共同承包。共同承包的各方对承包合同的履行承担连带责任。”

  • 摇到的车牌可以过户给家里人吗(摇不到号把奥迪车挂在别人名下)

    今年4月9日,两人完成了过户手续,就这样,车某做了陈某的专职驾驶员。接警后,余杭区公安分局临平刑侦中队多方调查取证,经过半个月的侦查,将车某、江某和何某3人抓获。因涉嫌诈骗罪,3人均被余杭警方依法刑事拘留,案件还在进一步侦办当中。至于陈某的那辆奥迪A6L,警方表示,因为买车人是通过二手车市场正常购得,并且对车某等人的诈骗行为并不知情,属于善意取得,无法追回。