const cdnDependencies = require("./dependencies-cdn"); // 引入文件的 cdn 链接 const cdn = { css: cdnDependencies.map((e) => e.css).filter((e) => e), js: cdnDependencies.map((e) => e.js).filter((e) => e), }; class BuildAppJSPlugin { apply(compiler) { // emit 是异步 hook,使用 tapAsync 触及它,还可以使用 tapPromise/tap(同步) compiler.hooks.emit.tapAsync( "BuildAppJSPlugin", (compilation, callback) => { let cssarr = []; let jsarr = []; // 遍历所有编译过的资源文件, // 对于每个文件名称,都添加一行内容。 for (let filename in compilation.assets) { if (filename.match(".*\\.js$")) { if (process.env.NODE_ENV === "production") { filename = (process.env.VUE_APP_CDN_PATH || "/") + filename; } else { filename = "/" + filename; } jsarr.push(filename); } if (filename.match(".*\\.css$")) { cssarr.push(filename); } } cssarr = cssarr.sort(function(a) { return a.indexOf("app."); }); var cdnjs = '' if (process.env.NODE_ENV === "production") { cssarr = cdn.css.concat(cssarr); cdnjs = `var cdnjs = ${JSON.stringify(cdn.js)}; cdnjs.forEach((item) => { document.write(''); });` } else { cssarr = cssarr.concat(cdnDependencies .filter((e) => e.name === "") .map((e) => e.css)); } let content = ` var scripts = ${JSON.stringify(jsarr)}; ${cdnjs} scripts.forEach((item) => { document.write(''); }); `; let cssContent = '' cssarr.forEach(item=>{ cssContent += `@import url(${item});\n` }) // 将这个列表作为一个新的文件资源,插入到 webpack 构建中: compilation.assets["app.js"] = { source: function() { return content; }, size: function() { return jsarr.length; }, }; compilation.assets["style.css"] = { source: function() { return cssContent; }, size: function() { return cssarr.length; }, }; callback(); } ); } } module.exports = BuildAppJSPlugin;