高级前端webpack【Q073】webpack 中的 loader 的作用是什么

webpack 中的 loader 的作用是什么

Issue 欢迎在 Gtihub Issue 中回答此问题: Issue 74

Author 回答者: wang120140

哎 lodaer 的作用就是处理单个文件的 跳到这啥都没有

Author 回答者: Linya-IronMan

webpack 是基于node的,只能处理 JS JSON 文件,loader 的作用是用来处理其他类型的文件(less\vue…等) 可以将 less 转成 css 文件,将 jsx 处理成 JS 文件,将其他版本的ES处理成浏览器能识别的ES版本

Author 回答者: shfshanyue

loader 用以对某个文件进行 import 或者 require,在此过程中可能会涉及到解析与编译,如 js 通过 babel 进行编译。

以下是 url-loader 的源码,用以转化为 Base64 URL 的一个 loader,从中可以看出它把源代码 content 转化为被 webpack 支持的模块 module.exports = ***

function getEncodedData(generator, mimetype, encoding, content, resourcePath) {
  if (generator) {
    return generator(content, mimetype, encoding, resourcePath);
  }
 
  return `data:${mimetype}${encoding ? `;${encoding}` : ""},${content.toString(
    // eslint-disable-next-line no-undefined
    encoding || undefined,
  )}`;
}
 
export default function loader(content) {
  // Loader Options
  const options = getOptions(this) || {};
 
  validate(schema, options, {
    name: "URL Loader",
    baseDataPath: "options",
  });
 
  if (shouldTransform(options.limit, content.length)) {
    const { resourcePath } = this;
    const mimetype = getMimetype(options.mimetype, resourcePath);
    const encoding = getEncoding(options.encoding);
 
    if (typeof content === "string") {
      // eslint-disable-next-line no-param-reassign
      content = Buffer.from(content);
    }
 
    const encodedData = getEncodedData(
      options.generator,
      mimetype,
      encoding,
      content,
      resourcePath,
    );
 
    const esModule =
      typeof options.esModule !== "undefined" ? options.esModule : true;
 
    return `${
      esModule ? "export default" : "module.exports ="
    } ${JSON.stringify(encodedData)}`;
  }
 
  // 忽略
}
 
// Loader Mode
export const raw = true;