Open wuyuedefeng opened 4 years ago
/*
* runScript:一个promise同步方法。可以代替创建一个script标签,然后加载服务
* */
const runScript = async (url) => {
return new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.onload = resolve
script.onerror = reject
// const firstScript = document.getElementsByTagName('script')[0]
// firstScript.parentNode.insertBefore(script, firstScript)
document.querySelector('head').appendChild(script)
})
}
function loadScriptWithUrl(url) {
return new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.language = 'javascript'
script.onload = resolve
script.onerror = reject
// const firstScript = document.getElementsByTagName('script')[0]
// firstScript.parentNode.insertBefore(script, firstScript)
document.getElementsByTagName('head')[0].appendChild(script)
})
}
class NpmInstaller {
constructor() {
this.npmInstalled = {}
}
async install(originName) {
// Trim string
const name = originName.trim()
if (this.npmInstalled[name]) {
return
} else {
// 三种引入方式
// 如果是一个有效的URL,直接通过<script />标签插入
if (/^https?:\/\//.test(name)) {
this.npmInstalled[name] = this.injectScript(name)
}
// 如果指定了版本,尝试使用unpkg加载
else if (name.indexOf('@') !== -1) {
this.npmInstalled[name] = this.unpkg(name)
}
// 否则,尝试使用cdnjs搜索
else {
this.npmInstalled[name] = this.cdnjs(name)
}
return await this.npmInstalled[name]
}
}
async injectScript(url, pkgName = '') {
return new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.onload = () => {
resolve()
}
script.onerror = () => {
reject()
}
document.body.appendChild(script);
// document.body.removeChild(script);
})
}
async unpkg(name) {
await this.injectScript(`https://unpkg.com/${name}`, name)
}
async cdnjs(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 />标签插入
await this.injectScript(url, name)
}
}
window.npmInstaller = window.npmInstaller || new NpmInstaller()
npmInstaller.install('moment').then(() => console.log("moment install success"))
npmInstaller.install('jquery').then(() => console.log("jquery install success"))
三木开发专用
Table of Contents Everywhere 自动生成目录
For 钉钉新校招 - 点击任一dom直接拷贝文字