日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

webpack系列-plugin

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 webpack系列-plugin 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

plugin簡(jiǎn)介

plugin的本質(zhì)是一個(gè)類,類里面有一個(gè)apply方法,apply的參數(shù)為compiler,在其上面會(huì)有一些hooks,不同的hooks對(duì)應(yīng)不同的tapable實(shí)例。

同步和異步的生命周期的plugin

webpack打包完畢觸發(fā)的hooks

class DonePlugin{apply(compiler){compiler.hooks.done.tap('DonePlugin',()=>{console.log('編譯完成')})}}class AsyncPlugin {apply(compiler){compiler.hooks.emit.tapAsync('AsyncPlugin',(compilation,cb)=>{setTimeout(()=>{cb()},1000))compiler.hooks.emit.tapPromise('AsyncPlugin',(compilation)=>{return new Promise((resolve,reject)=>{setTimeout(()=>{resolve()},1000)}))}}// 使用plugins:[new DonePlugin(),new AsyncPlugin()] 復(fù)制代碼

文件列表插件

class FileListPlugin {constructor(filename){this.filename = filename; }apply(compiler){compiler.hooks.emit.tap('FileListPlugin',(compilation)=>{// 獲取所有打包的文件let assets = compilation.assetslet content = `## 文件名 資源大小`;// [[bundle.js,{}],[index.html,{}]]Object.entries(assets).forEach([filename,statObj]=>{content+= `- ${filename} ${statObj.size()}`})assets[this.filename] = {source(){return content},size(){return content.length}}})}}// 使用plugins:[new FileListPlugin({filename:'list.md'})] 復(fù)制代碼

內(nèi)聯(lián)資源插件

將link或者script引入的方式變成內(nèi)聯(lián)的樣式。

let HtmlWebpackPlugin = require('html-webpack-plugin')class InlineSourcePlugin {constructor({match}){this.match = match;}processTag(tag,compilation){// 取出css路徑和js路徑let url = tag.attributes.href || tag.attributes.src if(this.match.test(url)){// 修改cssif(tag.tagName === 'link'){tag = {tagName:'style',innerHTML:compilation.assets[url].source()}}// 修改jsif(tag.tagName === 'script'){tag = {tagName:'script',innerHTML:compilation.assets[url].source()}}delete compilation.assets[url]; // 從打包后的資源中刪除掉}return tag;}processTags(data,compilation){let headTags = data.headTags;let bodyTags = data.bodyTags;headTags = headTags.map(tag=>{return this.processTag(tag,compilation)});bodyTags = bodyTags.map(tag=>{return this.processTag(tag,compilation)});return {...data,headTags,bodyTags}}apply (compiler) {compiler.hooks.compilation.tap('MyPlugin', (compilation) => {console.log('The compiler is starting a new compilation...')HtmlWebpackPlugin.getHooks(compilation).alterAssetTagGroups.tapAsync('MyPlugin', (data, cb) => {data = this.processTags(data,compilation);cb(null, data)})})}}module.exports = InlineSourcePlugin;// 使用plugins:[new InlineSourcePlugin({match:/\.(js|css)$/})] 復(fù)制代碼

上傳插件

let qiniu = require('qiniu');let path = require('path');class UploadPlugin {constructor(options = {}) {let { bucket = '', domain = "", accessKey = '', secretKey = '' } = options;let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);let putPolicy = new qiniu.rs.PutPolicy({ scope: bucket });this.uploadToken = putPolicy.uploadToken(mac);let config = new qiniu.conf.Config();this.formUploader = new qiniu.form_up.FormUploader(config);this.putExtra = new qiniu.form_up.PutExtra();}apply(compiler){compiler.hooks.afterEmit.tapPromise('UploadPlugin',(compilation)=>{let assets = compilation.assets;let promises = [];Object.keys(assets).forEach(filename=>{promises.push(this.upload(filename));});return Promise.all(promises)})}upload(filename) {return new Promise((resolve,reject)=>{let realPath = path.resolve(__dirname,'../dist',filename)this.formUploader.putFile(this.uploadToken, filename, realPath, this.putExtra,(err,body)=>{err?reject(err):resolve(body);})});}} module.exports = UploadPlugin; 復(fù)制代碼

總結(jié)

以上是生活随笔為你收集整理的webpack系列-plugin的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。