xslt-insert-html-webpack-plugin
Version:
A Webpack plugin to insert html tag in head
108 lines (92 loc) • 3.13 kB
JavaScript
/**
* 先移除link和script标签
* 然后再根据传进来的参数添加新的标签
**/
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};
var et = require('elementtree');
var fs = require('fs');
var path = require('path');
var ElementTree = et.ElementTree;
var element = et.Element;
var subElement = et.SubElement;
// .replace(/^\uFEFF/, '')
var parseXml = function parseXml(filename) {
return new et.ElementTree(et.XML(fs.readFileSync(filename, 'utf-8')));
};
// 删除找到的link或script节点
var changeNode = function (xml, tag, attrs) {
var head = xml.find('./xsl:template/head')
var node = subElement(head, tag)
Object.keys(attrs).forEach(function (attr) {
var value = attrs[attr];
node.attrib[attr] = value;
console.log('----------------------正在创建xsl节点和节点属性:tag, attr, value = ', tag, attr, value)
})
}
function XsltInsertHtmlWebpackPlugin(options) {
this.options = options
}
XsltInsertHtmlWebpackPlugin.prototype.apply = function (compiler) {
var self = this
compiler.plugin('emit', function (compilation, callback) {
var file = self.options.file
var nodes = file.data || []
var template = path.resolve(compiler.context, file.template);
var xmlPath = file.path || ''
var xmlFilename = path.join(xmlPath, file.filename)
var xml = parseXml(template);
if (nodes) {
// 删除links标签
var head = xml.find('./xsl:template/head')
var links = head.findall('link')
// console.log(links)
links.forEach(function (link) {
head.remove(link)
})
var scripts = head.findall('script')
scripts.forEach(function (script) {
if(script.attrib.src.indexOf('lib') < 0) {
head.remove(script)
}
})
Object.keys(nodes).forEach(function (tag) {
if (_typeof(nodes[tag]) !== 'object') {
throw new Error('传入参数的格式不正确');
} else {
changeNode(xml, tag, nodes[tag])
}
});
} else {
throw new Error('Not config options defined!!');
}
console.log('----------------------开始输出xsl文件:', xmlFilename, '----------------------')
// 最后输出的xml内容
var xmlContent = xml.write({indent: 4})
// if部分暂时无用
if (file.writeToContext) {
xmlFilename = path.join(compiler.context, xmlFilename)
fs.writeFile(filename, xmlContent, function (err) {
if (err) {
compilation.errors.push(err)
}
})
} else {
compilation.assets[xmlFilename] = {
source: function () {
return xmlContent
},
size: function () {
return xmlContent.length
}
}
}
console.log('----------------------输出xsl文件结束----------------------')
return callback()
});
// }
}
module.exports = XsltInsertHtmlWebpackPlugin;