长兴县建设局网站,湘乡新闻头条,搜索引擎优化的主要特征,青岛网站排名方案序言
对于 webpack 来说#xff0c; loader 和 plugin 可以算是需求程度最为广泛的配置项了。但是呢#xff0c;单单止步于配置可能还不够。如果我们自己有时候想要 diy 一个需求#xff0c;但是 webpack 又没有相关的 loader 和 plugin 。那这个时候我们可能就得开始造点轮…序言
对于 webpack 来说 loader 和 plugin 可以算是需求程度最为广泛的配置项了。但是呢单单止步于配置可能还不够。如果我们自己有时候想要 diy 一个需求但是 webpack 又没有相关的 loader 和 plugin 。那这个时候我们可能就得开始造点轮子来供给自己使用了。
因此在今天的文章当中将带领大家手写一个简易的 loader 和 plugin 并学会如何在项目中运用自己所编写的 loader 和 plugin 。
一起来学习吧~
一、如何编写一个Loader
1. 碎碎念
之前的文章中我们讲到了关于 loader 的一些配置。那如果把那些引用的 loader 改为我们写的 loader 该怎么处理呢
现在我们来了解一下如何手写一个简易的 loader 并运用到我们的项目当中。
2. 项目结构
首先用一张图来看我们的项目结构。如下图所示 其中 loaders 文件夹下放置我们想要写的 loader 同时里面的 replaceLoader.js 文件放置我们即将要写的 loader 的代码逻辑。之后index.js 文件是我们的入口文件放置我们的业务逻辑。 webpack.config.js 文件放置关于 webpack 的相关配置而 dist 文件夹内的内容放置的是我们通过 webpack 打包后生成的打包文件。
3. 业务代码编写
1入口文件代码
现在我们先来编写入口文件 index.js 的代码。具体代码如下
console.log(hello monday);2编写loader
入口文件的内容很简单我们想要达到的目的就是输出 hello monday 这个语句。现在我们来编写 loader 的内容已达到对入口文件 index.js 的内容进行修改。 replaceLoader.js 文件的代码具体如下
module.exports function(source) {const result source.replace(monday, mondaylab);this.callback(null, result);
}以上的代码意思为将入口文件 index.js 文件中的 monday 替换为 mondaylab 。这样写似乎没啥问题但是大家有没有想过我们有时候传的属性可能会很诡异不一定每次都能像这样以字符串的形式来替换。
所以我们引用 webpack 官方推荐的 loadertils 这个工具来解决这个问题。
第一步 安装 loader-utils 插件。具体命令如下
npm install loader-utils --save-dev第二步 改造 loader 文件。接下来我们对 replaceLoader.js 文件进行改造升级具体代码如下
const loaderUtils require(loader-utils);//用function的原因在于为了业务层可以调用this
//source为引入文件的源代码
module.exports function(source) {//getOptions会自动地帮我们分析this.query,然后把参数的所有内容放在options里面去const options loaderUtils.getOptions(this);const result source.replace(monday, options.name);this.callback(null, result);
}大家可以看到通过使用 loaderUtils 插件间接地调用 getOptions 方法来自动的帮我们分析 this.query 从而取到我们想要的内容。
值得注意的是我们还需要再了解一下 this.callback 的内容。
一般情况下如果我们接收到了源代码 source 那么现在我们只能对源代码做处理。但是呢有的时候我们想要使用一些 sourceMap 或者对源代码分析好了之后我们不仅想要返回源代码还要把 sourceMap 也带回去。
因为我们 return 的时候只能 return 一个参数其余的一些额外的内容就带不出去了。这个时候呢我们就需要 this.callback 来帮我们把 sourceMap 给带出去。因此一般用 this.callback 来返回内容。
3引用loader
现在我们在 webpack.config.js 中来引入我们上面的 loader 。具体配置如下
const path require(path);module.exports {mode: development,entry: {main: ./src/index.js},module: {rules: [{test: /\.js/,use: [{loader: path.resolve(__dirname, ./loaders/replaceLoader.js),//上面的options.name中的nameoptions: {name: mondaylab}} ]}]},output: {path: path.resolve(__dirname, dist),filename: [name].js }
}通过以上方式我们写了一个简易的 loader 这个 loader 实现了将 monday 替换为 mondaylab 的功能。并且供我们在 webpack 中使用自己书写的 loader 。
4在loader里面做一些异步的操作
好了现在如果我们想要给 loader 做一些异步操作该怎么实现呢
在我们所写的 loader 当中加入异步操作那么我们需要调用官方提供给我们的 this.async() 这个 API 来实现。现在我们来改造一下 replaceLoader.js 文件的代码。具体代码如下
const loaderUtils require(loader-utils);module.exports function(source) {const options loaderUtils.getOptions(this);//调用this.async()这个API来给异步代码使用const callback this.async();setTimeout(() {const result source.replace(monday, options.name);callback(null, result);}, 1000);
}通过这种方式我们就可以在 loader 中编写异步代码来达到我们想要的效果。
5loader路径自定义
有一个很小的注意点就是当我们在配置 webpack.config.js 文件中 loader 的路径时每回都要 path.resolve 去寻找路径文件。文件少的时候还好但如果遇到多文件的时候呢岂不是会很麻烦。
所以我们引用 resolveLoader 来简化它。现在我们在 webpack.config.js 文件中进行改造。具体配置如下
const path require(path);module.exports {// 先到node_modules中去找找不到则去./loaders目录下去找resolveLoader: {modules: [node_modules, ./loaders]},module: {rules: [{test: /\.js/,use: [{loader: replaceLoader}]}]}
}参考 前端进阶面试题详细解答
通过配置 resolveLoader 来对文件文件目录进行查找从而简化了路径内容。
二、如何编写一个Plugin
1. 碎碎念
在讲解 plugin 之前我们先来了解 loader 和 plugin 的区别。
当我们在源代码里面去引入一个新的 js 文件或者是一个其他格式的文件时这个时候我们可以借用 loader 来帮我们处理我们引用的 loader 文件。 loader 的作用就在于帮助我们处理引用的模块。
而 plugin 呢是当我们在做打包的时候在某些具体时刻上比如说当我们打包结束之后我们要生成一个 html 文件这个时候我们就可以使用一个 htmlWebpackPlugin 的插件。使用它之后他就会在打包结束之后帮我们生成对应的 html 文件。
再比如我们要在打包之前把 dist 目录进行清空这个时候我们就可以使用 cleanWebpackPlugin 来帮助我们做这件事情。
所以 plugin 插件在什么时候生效呢
它在我们打包过程中的某些时刻里就是插件生效的场景。
plugin 的编写相对于 loader 来说会难一点点。但是呢如果有看过 webpack 源码的小伙伴们可能会知道 webpack 的一些底层原理都是依据 plugin 来进行编写的。所以我们还是有必要来学习一下 plugin 的编写。
下面就带领大家来编写一个简易的 plugin ~
2. 项目结构
对于 webpack 的 plugin 来说它是是基于发布者订阅的设计模式也可以说是基于事件驱动来实现的。在这个事件驱动里代码之间的执行是通过事件来进行驱动的。
接下来我们就来写一个简易的 plugin 。
首先用一张图来看我们的项目结构。如下图所示 其中 plugins 文件夹下放置我们想要写的 plugin 同时里面的 copyright-webpack-plugin.js 文件放置我们即将要写的 plugin 的代码逻辑。之后index.js 文件是我们的入口文件放置我们的业务逻辑。 webpack.config.js 文件放置关于 webpack 的相关配置而 dist 文件夹内的内容放置的是我们通过 webpack 打包后生成的打包文件。
3. 业务代码编写
1入口文件代码
现在我们先来编写入口文件 index.js 的代码。具体代码如下
console.log(hello monday);2编写plugin
现在我们来编写 plugin 的内容 copyright-webpack-plugin.js 文件的代码具体如下
class CopyrightWebpackPlugin {//编写一个构造器constructor(options) {console.log(options)}apply(compiler) {//遇到同步时刻compiler.hooks.compile.tap(CopyrightWebpackPlugin,() {console.log(compiler);});//遇到异步时刻//当要把代码放到dist目录之前要走下面这个函数//Compilation存放打包的所有内容Compilation.assets放置生成的内容compiler.hooks.emit.tapAsync(CopyrightWebpackPlugin, (Compilation, cb) {debugger;// 往代码中增加一个文件copyright.txtCompilation.assets[copyright.txt] {source: function() {return copyright by monday;},size: function() {return 19;}};cb();})}
}module.exports CopyrightWebpackPlugin;上面的这个插件中想要实现的功能就是获取版权信息。
3引用plugin
现在我们在 webpack.config.js 中来引入我们上面的 plugin 。具体配置如下
const path require(path);
const CopyrightWebpackPlugin require(./plugins/copyright-webpack-plugin);module.exports {mode: development,entry: { main: ./src/index.js},plugins: [new CopyrightWebpackPlugin({name: monday})],output: {path: path.resolve(__dirname, dist),filename: [name].js}
}通过上述代码我们可以了解到在2中我们首先需要定义一个类之后呢在类中写一个构造器和一个 apply() 方法来调用。然后呢大家看到3通过 require 的方式来进行 new 实例 实例化一个插件从而在项目中使用这个插件。
最终我们项目进行打包时就会生成一个 dist 目录并且在目录下增加一个 copyright.txt 文件并且文件中的内容就是 copyright by monday 。
三、结束语
在上面的文章中讲解了关于loader和plugin的基本编写思路以及如何在项目中对他们进行运用相信大家对这一块内容有了基础的认识。
到这里loader和plugin的编写讲解就结束啦希望对大家有帮助~ 文章转载自: http://www.morning.ttryd.cn.gov.cn.ttryd.cn http://www.morning.jmnfh.cn.gov.cn.jmnfh.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.xnwjt.cn.gov.cn.xnwjt.cn http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.czgtt.cn.gov.cn.czgtt.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.pwppk.cn.gov.cn.pwppk.cn http://www.morning.nywrm.cn.gov.cn.nywrm.cn http://www.morning.czgfn.cn.gov.cn.czgfn.cn http://www.morning.gqfks.cn.gov.cn.gqfks.cn http://www.morning.dxrbp.cn.gov.cn.dxrbp.cn http://www.morning.pwgzh.cn.gov.cn.pwgzh.cn http://www.morning.qgbfx.cn.gov.cn.qgbfx.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn http://www.morning.ktyww.cn.gov.cn.ktyww.cn http://www.morning.xnzmc.cn.gov.cn.xnzmc.cn http://www.morning.blfll.cn.gov.cn.blfll.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.wqnc.cn.gov.cn.wqnc.cn http://www.morning.brmbm.cn.gov.cn.brmbm.cn http://www.morning.gynls.cn.gov.cn.gynls.cn http://www.morning.kxmyj.cn.gov.cn.kxmyj.cn http://www.morning.lxhgj.cn.gov.cn.lxhgj.cn http://www.morning.hnzrl.cn.gov.cn.hnzrl.cn http://www.morning.cwtrl.cn.gov.cn.cwtrl.cn http://www.morning.cbczs.cn.gov.cn.cbczs.cn http://www.morning.ckhry.cn.gov.cn.ckhry.cn http://www.morning.njnqn.cn.gov.cn.njnqn.cn http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.gcrlb.cn.gov.cn.gcrlb.cn http://www.morning.xhqwm.cn.gov.cn.xhqwm.cn http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn http://www.morning.rkbly.cn.gov.cn.rkbly.cn http://www.morning.qlznd.cn.gov.cn.qlznd.cn http://www.morning.lxfyn.cn.gov.cn.lxfyn.cn http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn http://www.morning.hsklc.cn.gov.cn.hsklc.cn http://www.morning.mpyry.cn.gov.cn.mpyry.cn http://www.morning.tslwz.cn.gov.cn.tslwz.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.bmyrl.cn.gov.cn.bmyrl.cn http://www.morning.c7491.cn.gov.cn.c7491.cn http://www.morning.mqzcn.cn.gov.cn.mqzcn.cn http://www.morning.jpydf.cn.gov.cn.jpydf.cn http://www.morning.lkbdy.cn.gov.cn.lkbdy.cn http://www.morning.xqxrm.cn.gov.cn.xqxrm.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.cnprt.cn.gov.cn.cnprt.cn http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn http://www.morning.tkjh.cn.gov.cn.tkjh.cn http://www.morning.fnrkh.cn.gov.cn.fnrkh.cn http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.zzqgc.cn.gov.cn.zzqgc.cn http://www.morning.qjsxf.cn.gov.cn.qjsxf.cn http://www.morning.trfrl.cn.gov.cn.trfrl.cn http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.btjyp.cn.gov.cn.btjyp.cn http://www.morning.fcrw.cn.gov.cn.fcrw.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.rgfx.cn.gov.cn.rgfx.cn http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn http://www.morning.jfmyt.cn.gov.cn.jfmyt.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.jqpq.cn.gov.cn.jqpq.cn http://www.morning.fnssm.cn.gov.cn.fnssm.cn http://www.morning.qynnw.cn.gov.cn.qynnw.cn http://www.morning.xyyplp.cn.gov.cn.xyyplp.cn http://www.morning.qrwdg.cn.gov.cn.qrwdg.cn