webpack真是个妖艳货色,说它是个工原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】作流,但是分明是个打包器,但是你说它是打【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。包器,又感觉太小看它。我在输出umd格式【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。的最终代码时,想兼容一下cmd,就是se【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.neta.js那套,只需要在define.am【未经授权禁止转载】未经授权,禁止复制转载。d后面加上define.cmd最为判断条【未经授权禁止转载】原创内容,盗版必究。件即可。
【未经授权禁止转载】【访问 www.tangshuang.n【作者:唐霜】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】【本文受版权保护】首先要解决的是怎样能够在webpack的【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。打包流程中插入一脚,能够处理自己的逻辑。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】其次要解决的是,怎么在这一脚中修改要输出著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】的代码内容。
【作者:唐霜】【关注微信公众号:wwwtangshua【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】ngnet】未经授权,禁止复制转载。第一个问题简单,就是使用插件。
【本文首发于唐霜的博客】【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netet 获取更多精彩内容】webpack的插件就是在webpack【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。的过程流中进行处理的代码。插件形式很简单本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net,首先创建一个function类:
【原创内容,转载请注明出处】未经授权,禁止复制转载。【访问 www.tangshuang.n本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】et 获取更多精彩内容】【未经授权禁止转载】function WebpackPlugin() {}
其次给这个类添加一个apply方法:
【本文受版权保护】本文版权归作者所有,未经授权不得转载。WebpackPlugin.prototype.apply = function(compiler) {
// ....
}
最后,在apply方法中通过compil本文版权归作者所有,未经授权不得转载。【本文受版权保护】er,在流程中的某些节点上挂载一个处理函【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】数。
本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【本文受版权保护】WebpackPlugin.prototype.apply = function(compiler) {
compiler.plugin("emit", function(compilation, callback) {
// 在这里使用compilation进行处理
})
}
这里面要你自己去详细了解三个东西:1. 【未经授权禁止转载】【原创不易,请尊重版权】compiler,2. compilat【作者:唐霜】著作权归作者所有,禁止商业用途转载。ion,3. 和emit同一个层面的其他转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。节点名。
【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】ang.net【作者:唐霜】上面的代码基本描绘了本文要实现目标的这个【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。插件的大致框架。如果你想写webpack本文作者:唐霜,转载请注明出处。【本文受版权保护】的插件,可能还需要更深入的去了解一下。
【版权所有,侵权必究】
第二个问题相对复杂一些,修改要输出的代【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。码内容就是要在文件生成之前对webpac未经授权,禁止复制转载。【作者:唐霜】k内存中的buffer进行修改。
我的处理办法,是直接通过compilat著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ion找到要输出的文件内容,通过repl【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】ace进行替换,替换完之后,又把内容塞回【本文首发于唐霜的博客】【作者:唐霜】去。
本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。import RawSource from "webpack/lib/RawSource"
export function WebpackSupportCmdInUmd() {}
WebpackSupportCmdInUmd.prototype.apply = function(compiler) {
compiler.plugin("emit", (compilation, callback) => {
if(compilation.options.output.libraryTarget !== "umd") {
return
}
let outputfile = compilation.options.output.filename
let assets = compilation.assets
let keys = Object.keys(assets)
keys.forEach(key => {
if(outputfile !== key || outputfile.substr(outputfile.lastIndexOf('.')) !== ".js") {
return
}
let asset = assets[key]
let content = asset.source()
content = content.replace("typeof define === 'function' && define.amd", "typeof define === 'function' && define.amd && define.cmd")
.replace('"function"==typeof define&&define.amd', '"function"==typeof define&&define.amd&&define.cmd')
assets[key] = new RawSource(content)
})
callback()
})
}
上面的代码就是我的全部代码。compil【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】ation.assets获取了所有的as【转载请注明来源】本文作者:唐霜,转载请注明出处。sets,也就是每一个要处理的文件,它的【本文首发于唐霜的博客】未经授权,禁止复制转载。key值是以options.output【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】.filename命名的,所以你可以看到【原创不易,请尊重版权】原创内容,盗版必究。我用outputfile去和key进行对原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。比。
【访问 www.tangshuang.n【本文受版权保护】【版权所有,侵权必究】et 获取更多精彩内容】【原创内容,转载请注明出处】【未经授权禁止转载】asset.source()是直接获取到原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。要输出的文件的内容。但是这个内容还是保存【未经授权禁止转载】【原创内容,转载请注明出处】在内存中的,还没有生成文件。而通过new本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】 RawSource则创建了新的asse【作者:唐霜】未经授权,禁止复制转载。t,再塞回去,这样输出来的文件内容就变了【作者:唐霜】【原创不易,请尊重版权】。
【版权所有】唐霜 www.tangshu【作者:唐霜】【原创不易,请尊重版权】ang.net未经授权,禁止复制转载。2016-12-29 10449 webpack


