实现原理
实现代码
let pkg_name_origin = null;
const npmInstall = (originName) => {
const name = originName.trim();
pkg_name_origin = name;
if (/^https?:\/\//.test(name)) return injectScript(name);
if (name.indexOf('@') !== -1) return unpkg(name);
return cdnjs(name);
};
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);
};
const unpkg = (name) => {
injectScript(`https://unpkg.com/${name}`);
};
const cdnjs = async (name) => {
const searchPromise = await fetch(
`https://api.cdnjs.com/libraries?search=${name}`,
{ 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.');
}
injectScript(url);
};
使用
npmInstall('moment');
npmInstall('moment@2.29.4');
npmInstall('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js');