webpack学习笔记--手写Loader

前言

Loader就像一个翻译员,能将源文件经过转化后输出新的结果,并且这个文件还可以链式地经过多个翻译员翻译。在开发Loader的时候,应该遵循单一职责原则,只需要完成一种转换,开发的过程中我们只关心Loader的输入和输出。webpack是运行在Node.js上的,一个Loader就是一个Node模块。这个模块需要导出一个函数,这个导出的函数的工作就是获得处理前的原内容,对原内容执行处理返回处理后的内容。

一个最简单的Loader

一个最简单的loader源码如下

module.exports = function (source) {
    //source为compiler 传递给 Loader 的一个文件的原内容
    //该函数需要返回处理后的内容,为了简单起见,直接将原内容返回了,相当于该Loader没有做任何转换
    return source
}

开始开发之前

  1. 获取Loaderoptions
    在开发一个Loader的时候,要获取传入的options,需要这样做
    const loaderUtils = require('loader-utils')
    module.exports = function (source) {
     //获取用户传入的options
     const options = loaderUtils.getOptions(this)
     return source
    }
  2. 同步与异步
    Loader有同步和异步之分,上面介绍的Loader是同步的Loader,但在某些场景下转换的步骤只能是异步完成的,例如我们需要通过网络请求才能得出结果,如果采用同步的方式,则网络请求会阻塞整个构建,导致构建非常缓慢。
    如果是异步转换,我们需要这样做
    module.exports = function (source) {
      //告诉webpack此次转换是异步的,Loader会在callback回调结果
      var callback = this.async()
      asyncOperation(source,function(err,result,sourceMaps,ast){
          callback(err,result,sourceMaps,ast)
      })
    }
  3. 加载本地Loader
    假设本地项目的Loader处于./src/loaders/myLoader中,需要如下配置
    module.exports = {
      resolveLoader:{
      //去哪些目录寻找loaders 有先后之分
      modules:['node_modules','./src/loaders']
      }
    }
    或者我们也可以这样配置,直接加载对应的Loader处理对应的文件
    const path = require('path')
    module.exports = {
      module: {
          rules: [{
              test: /\.js$/,
              use: [{
                  loader: path.resolve('loaders/test.js')
              }],
          }]
      },
    }
    

webpack.config.js中加上以上配置后,webpack先会去node_modules目录下寻找,如果找不到就会去./src/loaders下查找

开发我们的Loader

我们现在写一个简单的Loader,这个Loader的作用就是将JavaScript文件内容里面的字符串love转换成 ❤ 。
webpac.config.js的配置如下

//webpack.config.js
const path = require('path')
module.exports = {
    entry: './index.js',
    module: {
        rules: [{
            test: /\.js$/,
            use: [{
                loader: path.resolve('loaders/test.js')
            }],
        }]
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    }
}

我们自己写的Loader代码如下

//test.js
module.exports = function (source) {
    const regExp = new RegExp("love", "ig")
    const result = source.replace(regExp, "❤")
    return result
}

入口文件index.js里只有一行代码,即 module.exports="I love you" 执行打包命令npx webpack
可以看到打包后的文件bundle.js

([function (e, t) {
    e.exports = "I ❤ TAPD"
}])

我们的字符'love'已经被转换成了❤

全部评论

相关推荐

机智的豹子有点心碎:UU我还在找工作还没找到,一直在搜简历怎么改,总结了这些: 1.SEO:简历根据每一个岗位定制化:使用这个岗位中所描述的工作的词,它要求什么技能就把自己的技能描述成什么样子,把SEO用在自己身上(把我的简历和个人特质,当成一个热门产品来做 “搜索引擎优化”),让HR能用最低的门槛看到我 2."顺序:把岗位要求的技能跟经历放在简历的最开头、最显眼的位置" 3.包装:简历是一个最终交付说明书,只要最终学习成长做得到就可以,在合适的范围内自我吹捧(我这个人怎么能够在HR的角度被迅速的看懂和看到,减轻HR的工作压力) 4.每点加小标题​:用6~10字概括该段内容,便于面试官快速抓取信息。 5.避免空泛描述​:拒绝“培养了组织能力”等泛泛而谈,替换为具体行动和成果。 6."使用“三段式结构”​​:每段经历按“为什么做-做了什么-结果如何”展开: ​a) 为什么做​:痛点或目标(例如“品牌声量不足”) ​b) 做​了什么:方法论(例如“趋势洞察+竞品对标+人群细分”) ​c) 结果如何​:量化成果或影响(例如“推动客户投放20万预算”)" 7.量化成果​:用数字体现工作成效(如“整理500+份资料”“撰写2万字报告”)。 这些有的是我想去的岗的,如果对你有用的话按需修改就好~加油,早日上岸!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务