hash,chunkhash,contenthash的区别? hash:根据总资源列表生成的hash chunkhash:根据每一个chunk资源生成的hash contenthash:根据具体的文件生成的hash

    index.js:

    1. var src = require("./assets/webpack.png")
    2. console.log(src);
    3. var img = document.createElement("img")
    4. img.src = src;
    5. document.body.appendChild(img);

    webpack.config.js:

    1. module.exports = {
    2. mode: "development",
    3. devtool: "source-map",
    4. module: {
    5. rules: [
    6. {
    7. test: /\.(png)|(jpg)|(gif)$/,
    8. use: [{
    9. loader: "./loaders/img-loader.js",
    10. options: {
    11. limit: 3000, //3000字节以上使用图片,3000字节以内使用base64
    12. filename: "img-[contenthash:5].[ext]"
    13. }
    14. }]
    15. }
    16. ]
    17. }
    18. }

    img-loader.js:

    1. var loaderUtil = require("loader-utils")
    2. function loader(buffer) { //给的是buffer,也就是二进制格式
    3. console.log("文件数据大小:(字节)", buffer.byteLength);
    4. var { limit = 1000, filename = "[contenthash].[ext]" } = loaderUtil.getOptions(this); //此处是解构语法。 也可以var options = loaderUtil.getOptions(this);
    5. if (buffer.byteLength >= limit) { //超过限度,生成图片文件
    6. var content = getFilePath.call(this, buffer, filename);
    7. }
    8. else{
    9. var content = getBase64(buffer)
    10. }
    11. return `module.exports = \`${content}\``;
    12. }
    13. loader.raw = true; //该loader要处理的是原始数据
    14. module.exports = loader;
    15. function getBase64(buffer) {
    16. return "data:image/png;base64," + buffer.toString("base64"); //图片字符串格式
    17. }
    18. function getFilePath(buffer, name) {
    19. var filename = loaderUtil.interpolateName(this, name, { //生成一个名字。name也可以是"[contenthash]".[ext] ext:自动生成后缀
    20. content: buffer //文件内容
    21. });
    22. this.emitFile(filename, buffer); //emitFile:往hash里加入资源
    23. return filename;
    24. }

    效果:
    image.png