/file-loader

文件加载器

Primary LanguageTypeScriptMIT LicenseMIT

ks-file-loader

一个文件加载器

安装

  npm i ks-file-loader -D

Api

属性 类型 默认值 说明
path string './' 要处理目录(相对于项目目录, 而非文件所在目录)
name string / RegExp '' 要处理文件名
fullName string / RegExp '' 要处理文件 (文件名+扩展名)
ext string / RegExp '' 要处理文件类型
mode string 'BFS' 遍历模式: 深度优先(DFS)/广度优先(BFS)
exclude string / RegExp - 排除路径. 没有被排除的文件才会被加载
include string / RegExp - 包含路径. 默认排除 node_modules 这样的大文件夹, 如果要加载, 须在include中指定
deep boolean false 是否深层遍历
async boolean false 当不深层遍历时, 是否异步加载 (异步时使用Promise.all加载, 不采用异步可以保持顺序)
showDir boolean false 文件夹是否经过loader
readFile boolean false 是否读取文件内容
output string / Function - 输出文件名
outputDir string - 输出文件夹名
error function - 处理出错时的回调
done function - 处理完毕时的回调
loader function - 加载器. 参数( stats: 文件信息 data: 文件内容 done: 处理完成时要执行的回调)

loader函数有异步操作时, 有两种方式: 1、回调函数 2、Promise(推荐).
当执行loader函数后, 返回值
为 Promise 时, loader会先等待Promise执行完毕
为 false 时, 等待用户手动调用 done
为其它值时, 则继续执行

设置了fullName时, 不再验证文件名和扩展名

output 有字符串和函数两种形式

  • 值为字符串时 匹配规则为[(.?)(path|dir|name|hash|ext)(.?)](?|) [{前缀}{精确匹配}{后缀}]{?表示精确匹配为空时, 输出空字符串}
  • 值为函数时, 等同于loader, 但如果返回了一个字符串, 那么则会进入 值为字符串 时的流程

如何使用?

案例1: 用 hexo 生成的博客, 在源码中有大量的空行, 使用

// 调用示例
const fs = require("fs");
const fileLoader = require('ks-file-loader')

fileLoader({

  // 要进行转换的目录
  // 相对于项目目录, 而非文件所在目录
  path: './public',

  // 文件扩展名, 支持正则
  ext: 'html',

  // 文件名, 支持正则
  // name: '',

  // 完整文件名, 支持正则 (验证文件名 + 扩展名)
  // fullName: ''

  // 包含目录
  // 默认会排除 node_modules 这样的大文件夹, 如果要加载, 必须在include中指定
  // include: /2018/,

  // 排除目录
  exclude: /lib/,

  // 遍历模式: 广度优先(BFS) / 深度优先(DFS)
  mode: 'DFS',

  // 是否深层遍历
  deep: true,

  // 是否读取文件内容
  readFile: true,
  /**
   * 加载器
   * @param {object} stats 文件信息
   * @param {string} data 文件内容 readFile 为 false 时返回空字符串
   * @param {function} done 文件处理完毕的回调
   * @return {Promise|false|any} Promise: 使用Promise处理异步  false: 使用回调函数处理异步(处理完需手动调用done) 其它值: 默认为同步
   */
  loader: function(stats, data, done) {
    
    // do something..
    // 替换多余的空行
    var content = data.replace(/\n(\s+)\n+/g, '\n');

    // Promise方式处理异步操作
    return new Promise((resolve, reject) {
      fs.writeFile(stats.path, content, function(error){
        if(error){
          // 处理出错时, 即便通过reject抛出了错误, 也会被忽略, 因此需要用户自己先行处理错误
          reject(error);
        } else {
          resolve();
        }
      });
    });
    // 回调函数方式处理异步操作
    // 写入文件
    fs.writeFile(stats.path, content, function(error){
      if(error){
        console.log(error);
      }
      done();
    });
    // 返回值必须全等于false
    return false;
  },
  // 转换完毕
  done: function(){
    console.log('complete');
  }
});

案例2: 给指定类型的文件加hash

const fileLoader = require('ks-file-loader')
fileLoader({
  ext: /^(js|ts)$/,
  // output: '[dir/][name-]?[hash][.ext]',
  output: function(stats) {
    let name = /\.d\.ts$/.test(stats.path) ? stats.name.slice(0, -2) + '-[hash].d' : '[name-]?[hash]'
    return '[dir/]' + name + '[.ext]'
  }
})

lisence

MIT