自定义loader

328 阅读1分钟

配置文件

绝对路径配置loader
// webpack.config.js
{
  test: /\.js$/
  use: [
    {
      loader: path.resolve('loaders/myLoader1.js'),
      options: {name:'myLoader1'}
    },
     {
      loader: path.resolve('loaders/myLoader2.js'),
      options: {name:'myLoader2'}
    }
  ]
},
 
可以使用resolveLoader.modules配置,进行自动搜索
// webpack.config.js
resolveLoader: {
  modules: [
    'node_modules',
    path.resolve(__dirname, 'loaders')
  ]
},
module:{
    rules:[
    {
      test: /\.less$/,
      use:[
        {
          loader:'style_loader'
        },
        {
          loader:'less_loader'
        }
      ]
    }
    ]
  }

编写用法

  • loader是一个函数,会通过loader runner进行调用,函数内通过this调用loader API,因此loader函数不能使用箭头函数
  • loader接收的参数有三个:source(资源文件的内容),map(sourcemap),meta(抽象语法树ast)
  • 必须有返回值,或调用callback返回值
简单示例
module.exports = function(source,map,meta){
  console.log(source,this.query)
  this.callback(null,source,map,meta)
  // return source
}
/**
输出:

import b from './b.js';
export default 'aaaaa'+b { name: 'myloader2' }
import b from './b.js';
export default 'aaaaa'+b { name: 'myloader1' }
import c from './c.js';
export default 'bbbbbbb'+c; { name: 'myloader2' }
import c from './c.js';
export default 'bbbbbbb'+c; { name: 'myloader1' }
export default 'cccccccccccccc'; { name: 'myloader2' }
export default 'cccccccccccccc'; { name: 'myloader1' }
*/

编写less_loader示例

注意:先安装less

var less = require('less')
module.exports = function(source){
  var callback = this.async();
  less.render(source).then(function(output){
    // console.log('less------------',output.css)
    callback(null,JSON.stringify(output.css),output.map)
  })
  
}

编写style_loader示例

module.exports = function(source){
  return `
  ;(function(){
    var head = document.createElement('style');
    head.innerHTML = ${source}
    document.getElementsByTagName('head')[0].appendChild(head)
    })();
  `
}

效果图展示

image.png 源码:github.com/logmei/fron…

参考文献