Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在浏览器控制台安装 NPM 包是什么体验?

在浏览器控制台安装 NPM 包是什么体验?

作者头像
刘小夕
发布于 2021-11-25 01:51:51
发布于 2021-11-25 01:51:51
1.4K00
代码可运行
举报
文章被收录于专栏:前端宇宙前端宇宙
运行总次数:0
代码可运行

来自同事独钓寒江雪的投稿,首发:https://juejin.cn/post/7023916328637431816

我们都知道,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 资源呢?这个问题可难不倒你:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在页面中插入<script />标签
const injectScript = (url) => {
  const script = document.createElement('script');
  script.src = url;
  document.body.appendChild(script);
};

我们还得在资源引入后以及出现错误时,给用户一些提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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[1] 提供了一个简单的 API,允许任何人快速查询 CDN 上的资源。具体使用读者可参考官方链接,这里给出一个根据包名查询 CDN 资源链接的示例,可以直接在浏览器地址栏打开这个链接查看:https://api.cdnjs.com/libraries?search=jquery,这是一个 get 请求,你将看到类似下面的页面,数组的第一项为名称/功能最相近的资源的最新 CDN 资源地址:

是以,根据包名搜索 cdn 资源 URL 便有如下的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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[2]在此时可以帮我们一个大忙。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 />标签来加载资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const unpkg = (name) => {
  injectScript(`https://unpkg.com/${name}`);
};

完整代码

将上面的代码简单整理,并通过一个统一的入口方法npmInstall进行调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 存储原始传入的名称
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')的方式在控制台进行调用:

下面这些调用方式自然也是支持的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npmInstall('jquery'); // 直接引入
npmInstall('jquery@2'); // 指定版本
npmInstall('https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js'); // cdn地址

不每次都写这些函数行不行

看了上面的操作,确实很简单,但是也许你会说:每次要使用时,我都得在控制台定义和调用函数,有些麻烦,不每次都写这些函数行不行?那自然是行的啦,你完全可以自己写一个浏览器插件,将这些 JS 代码注入页面,详情可参考7 分钟学会写一个浏览器插件——突破某 SDN 未登录禁止复制的限制[3]

如果你实在不想写,其实有人已经为你写好了,那便是Console Importer,它可以让你的浏览器控制台成为更强大的实验场。

  • 使用示例:

效果图:

链接:Console Importer[4] | Chrome 插件地址[5]

可以干什么

那么,本文介绍的方法和工具到底有什么用呢?

平时开发中,我们经常会想要在项目里尝试一些操作或者验证一些库的方法、打印结果,通过本文的学习,以后你完全可以直接在控制台引入loadsh、moment、jQuery、React 等来进行使用和验证,减少在项目中进行console.log验证后再删除的频次。

  • 你可以通过引入jQuery方便的进行一些项目、页面中的 DOM 操作;
  • 你可以通过引入axios进行一些简单的接口请求;
  • 你可以通过引入moment.js来验证一些时间格式化方法的使用;
  • 你可以通过引入loadsh并调用它的方法完成一些便捷的计算;
  • ...

可以学到什么

unpkg

unpkg[6] 是一个内容源自 npm 的前端常用全球快速 CDN,它能以快速、简洁、优雅的方式提供任意包、任意文件的访问,在流行的类库、框架文档中常常能看到它的身影。使用方式一般是unpkg.com/:package@:version/:file。或者更简洁一点:https://unpkg.com/包名,包名包含版本号时,你将获得对应版本的 js 文件,不包含版本号时,你将获得这个库的最新版 js 文件。

cdnjs

cdnjs[7] 是一种免费的开源 CDN 服务,受到超过 12.5% 的网站的信任,每月处理超过 2000 亿次请求,由 Cloudflare 提供支持。它类似 Google CDN 和微软 CDN 服务,但是速度比这二者更加快。CDNJS 上提供了众多 JavaScript 库,你可以直接在网页上引用这些 JS 文件,实现用户浏览网站的最佳速度体验。

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

大道至简,繁在人心

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

参考资料

[1]cdnjs: https://cdnjs.com/api

[2]UNPKG: https://unpkg.com/

[3]7 分钟学会写一个浏览器插件——突破某 SDN 未登录禁止复制的限制: https://king-hcj.github.io/2021/10/17/browser-extension/

[4]Console Importer: https://github.com/pd4d10/console-importer

[5]Chrome 插件地址: https://chrome.google.com/webstore/detail/console-importer/hgajpakhafplebkdljleajgbpdmplhie

[6]unpkg: https://unpkg.com/

[7]cdnjs: https://cdnjs.com/

[8]Console Importer: https://github.com/pd4d10/console-importer

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
网络请求AJAX
​Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。 [3] 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
郭顺发
2023/07/17
1290
《庆余年2》遭遇“开源”盗版,npm社区“被迫”暂停服务
这几天《庆余年2》播放的是如火如荼,老婆每天回家第一件事就是追剧、vip 那更是要安排上。腾讯的除了 vip,还搞个 vvip、当然商业变现都能理解。
JavaPub
2024/05/22
9120
《庆余年2》遭遇“开源”盗版,npm社区“被迫”暂停服务
实用程序包utils - 基于Rollup打包输出各模块文件(二)
上一次,我们讲到了如何去搭建一个前端工具库的工程,那么今天我们来聊一聊如何去将其打包输出。
江涛学编程
2021/07/14
8230
使用Skypack在浏览器上直接导入ES模块
笔者最近给自己的项目CodeRun增加了一个直接在浏览器上使用ES模块的功能,之前使用一个包前需要先找到它的在线CDN地址然后引进来,就像这样:
街角小林
2022/05/11
1.5K0
使用Skypack在浏览器上直接导入ES模块
【前端】:模块化 - 打包技术
ES modules export live bindings, not values, so values can be changed after they are initially imported as per.
WEBJ2EE
2020/09/01
1.5K0
【前端】:模块化 - 打包技术
type="module" 你了解,但 type="importmap" 你知道吗
当ES模块第一次在ECMAScript 2015中被引入,作为在JavaScript中标准化模块系统的一种方式时,它是通过在import语句中指定相对或绝对路径来实现的。
前端小智@大迁世界
2022/09/19
3.6K1
前端如何填充word模板
上篇文章介绍了如何使用nodejs填充word模板,今天介绍一下哎浏览器端如何填充word模板。
挥刀北上
2021/02/09
2.1K0
如何不基于构建工具优雅的实现模块导入?
当 ES Module 最开始作为一种新的 JavaScript 模块化方案在 ES6 中被引入的候,其实是通过在 import 语句中强制指定相对路径或绝对路径来实现的。
ConardLi
2023/01/09
1.3K0
如何不基于构建工具优雅的实现模块导入?
在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)
你最喜欢用什么工具来编写机器学习模型?数据科学家们对这个永恒的问题会给出各种不同的答案。一些人喜欢RStudio,另一些人更喜欢Jupyter Notebooks。我绝对属于后者。
大数据文摘
2019/07/11
2.2K0
在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)
使用 Houdini 扩展 CSS 的跨浏览器绘制能力
CSS Houdini 是一个总称,它描述了一系列底层的浏览器 API,这些 API 为开发者提供了对编写的样式更强大的能力。
ConardLi
2021/09/08
8260
使用 Houdini 扩展 CSS 的跨浏览器绘制能力
axios的安装和使用
参数说明: -g:表示全局安装,将会安装在你配置的:C:\Users\XinLiu\nodejs\node_global目录下。如果不指定则为当前文件夹所在目录(局部);
全栈程序员站长
2022/11/03
3K0
JavaScript日期处理不再难!Day.js带你飞!
本文介绍了Day.js的使用方法,Day.js 是一个轻量级的JavaScript库,用于解析、验证、操作和格式化日期和时间。Day.js 的使用方法类似于Moment.js,但 Day.js 的大小只有 2KB,比 Moment.js 更小。
前端小智@大迁世界
2023/04/21
9.9K0
JavaScript日期处理不再难!Day.js带你飞!
前端人员都懂的浏览器的同源策略,以及如何进行不同源间的相互访问
作为前端开发人员,你要是连同源策略都不知道是什么,那就太说不过去了。本篇文章将讲述同源策略的定义, 以及当我们需要克服同源策略,如何进行跨域访问数据的方法。
@零一
2021/01/29
1.4K0
前端人员都懂的浏览器的同源策略,以及如何进行不同源间的相互访问
Axios 教程:Vue + Axios 安装及实战 - 手把手教你搭建加密币实时价格看板
本文首发:《Axios 教程:Vue + Axios 安装及实战 - 手把手教你搭建加密币实时价格看板 - 卡拉云》
蒋川
2022/03/19
4.2K0
Axios 教程:Vue + Axios 安装及实战 - 手把手教你搭建加密币实时价格看板
组件传值&数据请求
每个组件 的作用域都是独立的, 有时候需要在组件之间完成数据的传递,需要通过组件传值的方式来实现 组件传值可以分为以下三类 父组件向子组件传递数据 子组件向父组件传递数据 非父子组件之间的数据传递 父传子 – 简化版 函数式组件传值 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello World</title> <!--react的核心库--> <sc
河湾欢儿
2018/09/06
2.9K0
不只是离线缓存! - 论如何善用ServiceWorker
ServiceWorker作为前端革命领袖,毫不夸张地被誉为前端黑科技,此文将阐述如何巧妙的使用它来实现一些看起来匪夷所思的事情。
ChenYFan
2022/01/17
3.7K2
不只是离线缓存! - 论如何善用ServiceWorker
实现一个 Code Pen:(四)浏览器编译代码
前面的文章中,我们配置好了编辑器,实现了 css、html、js 的编辑,现在我们需要做代码实时运行的功能了,并且可以直接写 less、scss、可以写 JavaScript、typescript、react。这个就涉及到了浏览器编译代码的逻辑,前期我们编译语言少一点、先把整体流程跑通,后面可以对语言和功能再慢慢丰富,这也是做项目的主要思路。
狂奔滴小马
2022/05/13
1K0
实现一个 Code Pen:(四)浏览器编译代码
六、中间件与跨域
在路由相应之前就会执行中间件的内容,例如在中间件中进行赋值,这种就可以在路由执行时使用这个值。
Dreamy.TZK
2020/07/07
6510
青骄第二课堂刷课时视频+知识竞赛浏览器油猴插件
去年分享过一次,今年又开始了,发现了一个可以刷课时的插件,之前我用的时候还是去年的版本,但是今天发现更新了,自带账号自动登录功能
纯情
2023/04/27
2.4K4
青骄第二课堂刷课时视频+知识竞赛浏览器油猴插件
总结vue3 的一些知识点:Vue.js 安装
我们可以在 Vue.js 的官网上直接下载 vue.min.js 并用 <script> 标签引入。
爱学iOS的小麦子
2023/06/02
5850
推荐阅读
相关推荐
网络请求AJAX
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验