咱们都晓得,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/librari...,这是一个 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....,并返回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/...'); // 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/librari...进行特定库的cdn地址的查找,这个API还会给你返回一些你所查问的库的替代品。

作者:獨釣寒江雪
链接:https://juejin.cn/post/702391...
起源:稀土掘金
著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。