n 如何编写html,webpack4系列教程,如何编写plugin处理html代码逻辑?

9ac5e4e30859fb63569e5fad0d8d2230.png本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规。大家都是程序员,不要闹得不开心。

在上一篇文章中,利用不同位置的publicPath,对html中的cdn地址,进行了处理。但是,遗留了一个小问题,就是css和js的cdn地址,并没有分开。

572d3bba38fc9b872bfe004fac5a7f1f.pngwebpack4系列教程,如何编写plugin处理html代码逻辑?(图4-1)

本文测试环境:win10、node@14.2.0、npm@6.14.4、webpack@4.43.0。

不大不小的误会

为了区分css和js的publicPath,苏南大叔想了一些办法,但是都失败了。output的publicPath,设置为函数。

结果就只能收到一个对象,里面包含了一个没啥用的hash。output: {

filename: 'js/[name].[hash:8].bundle.js',

path: path.resolve(__dirname, 'dist'),

publicPath: function (a, b) {

console.log(a,b);

return "//cdn/" + a.hash + "/";

}

},

670554ec6f6f9269e2834dc6db1d253a.pngwebpack4系列教程,如何编写plugin处理html代码逻辑?(图4-2)MiniCssExtractPlugin.loader的publicPath,设置为函数。

参数确实多了,不过,这个loader里面的publicPath,不是拿来设置css文件本身的地址的。而是用于处理css文件内部,引用的资源(例如图片和字体)的地址的。{

test: /\.css$/,

use: [

{

loader: MiniCssExtractPlugin.loader,

options: {

publicPath: (resourcePath, context) => {

return path.relative(path.dirname(resourcePath), context) + '/';

},

},

},

'css-loader',

],

},试图修改MiniCssExtractPlugin.loader

找到了一个函数,叫做mainTemplate.getAssetPath()。不会修改。试图修改HtmlWebpackPlugin

没分析出它的内部逻辑,不过在官网看到了一个hook它的html结果的例子。下面的代码是github上面的原版例子:// If your plugin is direct dependent to the html webpack plugin:

const HtmlWebpackPlugin = require('html-webpack-plugin');

// If your plugin is using html-webpack-plugin as an optional dependency

// you can use https://github.com/tallesl/node-safe-require instead:

const HtmlWebpackPlugin = require('safe-require')('html-webpack-plugin');

class MyPlugin {

apply (compiler) {

compiler.hooks.compilation.tap('MyPlugin', (compilation) => {

console.log('The compiler is starting a new compilation...')

// Static Plugin interface |compilation |HOOK NAME | register listener

HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(

'MyPlugin', //

(data, cb) => {

// Manipulate the content

data.html += 'The Magic Footer'

// Tell webpack to move on

cb(null, data)

}

)

})

}

}

module.exports = MyPlugin

编写一个plugin

最终,苏南大叔通过编写一个基于HtmlWebpackPlugin的webpack的plugin,成功的分开了css和js的publicPath。虽然代码写的并不是太好。但是毕竟解决了问题。下面是一些代码要点:获得配置中的outputcompilation.runtimeTemplate.outputOptions获得插件本身的optionsconstructor(options) {

// console.log('插件被使用了')

this.options = options;

}获得htmldata.html

0495c5db940cb85c5d878283c325359d.pngwebpack4系列教程,如何编写plugin处理html代码逻辑?(图4-3)

代码如下:

newsn.net:这里是【评论】可见内容

把上边这个代码保存到plugin/test.js文件。然后调用方式就是:

webpack.config.js:let MyPlugin = require(path.resolve(__dirname, 'plugin/test.js'));

module.exports = {

//...

output: {

//...

publicPath: "//cdn/",

},

plugins: [

new MyPlugin({ publicPath: '//css.cdn/' }),

//...

],

}

a9eaadfe0bf4cfed50854006a4e9b944.pngwebpack4系列教程,如何编写plugin处理html代码逻辑?(图4-4)

相关链接

总结

虽然在本文中,苏南大叔是利用了一个replace解决了区分css和js的cdn地址的需求。但是,这个插件也为苏南大叔打开了一扇门,对html模版,如果有什么不满意,就可以在这个地方进行修改了。很方便不是?

下面的地址,是苏南大叔写的webpack系列经验文章,欢迎点击:

93ddba5b688a6967c0a88c0220992c34.gif

e6eebe3032abd035b5cf072fe954fec6.png 如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。

9ac5e4e30859fb63569e5fad0d8d2230.png 本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值