webpack3.0学习笔记(二)

—— 与loader的爱恨情仇

目录一览

webpack3.0学习笔记(一)
webpack3.0学习笔记(二)
webpack3.0学习笔记(三)

项目源码地址


前情概要

webpack 学习笔记(一)中,对 css 相关的 loader 均有涉猎,所以本篇涉及到的 loader 仅包括:html-loader,url-loader,file-loader,image-webpack-loader 等上篇遗漏几个的使用情况。


以 html-loader 为引

html-loader 顾名思义的是引用时解析 .html 文件的加载器。

先把要用的几个 loader 一次安装:

yarn add -D extract-loader file-loader html-loader url-loader image-webpack-loader

或使用NPM进行安装:

npm i -D extract-loader file-loader html-loader url-loader image-webpack-loader

项目目录结构的:


项目目录结构

webpack.config.js 配置如下:

module.exports = {
    entry: {
        html: path.resolve(__dirname,'src/index.html'),
    },
    output: {
        filename: 'js/[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    module:{
        rules: [          
            {
                test: /\.html$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: '[name].[ext]'
                        }
                    },
                    'extract-loader',
                    {
                        loader: 'html-loader',
                        options: {
                            attrs: ["img:src", "link:href"]
                        }
                    }
                ],
            },
            {
                test: /\.css$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: '[name]-[hash:6].[ext]',
                            outputPath: 'css/'
                        }
                    },
                    "extract-loader",
                    {
                        loader: "css-loader",
                    }
                ]
            },
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            name: '[name]-[hash:6].[ext]',
                            outputPath: 'image/'
                        }
                    },
                ]
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin(['dist']),        
    ]
};

index.html 内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>this is webpack loader test</title>
    <link rel="stylesheet" href="./style/index.css" />
    <link rel="stylesheet" href="./style/one.css" />
</head>
<body>
    <img src = "image/shana-423df3.jpg" />
    <div class="yintama"></div>
</body>
</html>
  1. 通过 entry 中配置页面地址方式(这个方法很不好,后面会讲到这个问题)引入 html 文件,当然也可以配置一个入口 js 文件引用这个 html 页面也可以。
  2. 通过 html-loader 的配置项 attrs 获取页面内所有 img 标签的 srclink 标签的 href 地址,将图片和 css 等静态资源就都被引入 webpack 打包流程。
  3. css 匹配规则里使用了 extract-loader 目的是将 css 文件进行分离,再通过 file-loader 将其输出至打包后的对应目录。
  4. 图片及字体等资源文件均可通过 extract-loader + file-loader 在优化后进行分离生成本地文件的方式操作。
  5. 当然图片也可以使用 url-loader 进行处理,该 loader 是在 file-loader 上进行了扩展,增加 limit 配置,使得小于所设阈值的文件可以 Data URL 的形式内联,以图片为例则是转化为 Base64 的格式,超出阈值的则继续生成文件,转化后 html 文件会相应变大,何时内联图片请多斟酌。在使用 url-loader 前还可使用 image-webpack-loader 对图片进行压缩处理。
test: /\.(jpe?g|png|gif|svg)$/i,
use: [
    {
        loader: 'url-loader',
        options: {
            name: '[name]-[hash:6].[ext]',
            outputPath: 'image/',
            limit: 8192
        }
    },
    'image-webpack-loader'
]
图片转Base64
  1. 到现在还没有完,css和图片优化输出完这些静态资源文件后会生成其新路径,此时已在 html-loader那更新了对应地址,然后利用 extract-loader file-loader 将 'index.html' 分离出来。
...
<!-- html -->
<link rel="stylesheet" href="css/one-6438c2.css" />
<img src = "image/shana-423df3.jpg" />
<div class="yintama"></div>

<!-- css -->
.yintama {width: 440px;height: 200px;background:url(image/yintama-20a729.gif)}
...
图片路径

注意:
html 中的图片地址从 ./image/shana.jpg 被替换为 image/shana-423df3.jpg,而 css 中地址由 ../image/yintama.gif 替换为 image/yintama-20a729.gifhtml 引用图片路径正常,而 css 文件引用图片时路径则报错了,正确地址应该为 ../image/yintama-20a729.gif

  • 通过查看项目github发现这个路径生成规则是 file-loader 既定的逻辑。
    尝试使用 loaderuseRelativePath 配置,引用时的相对路径是保留了,但是生成图片的路径却出现问题,../image/yintama.gif图片层级是上一级,生成图片的路径 pathdist 目录,yintama.gif 这张图片被放置到项目根目录。
  • 相对路径这条路是走不通了,现在有两个办法:
    • 一是将 html 文件也放至 html 目录内,保持 css html 文件的目录层级相同,再设置 publicPath../../dist/ 保证引用目录的正确。(但是这样弊端很明显,一旦目录层级不统一依然会产生错误。很想把作者按在的地上摩擦,为何不能生成新路径时智能点)。
    • 二是将图片生成地址全换成绝对路径,在生成环境下配置 publicPath 为CDN路径,而开发环境下设置为 http://localhost:8080/dist/,开发环境打包也可以配置为以上地址,开启一个本地服务器即可访问测试。
const url = require('url')

module.exports = {
    ...
    module:{
        rules: [
            ...
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            name: '[name]-[hash:6].[ext]',
                            outputPath: 'image/',
                            limit: 1,
                            publicPath: url.format({
                                hostname:'localhost',
                                protocol:'http:',
                                port:8080,
                                pathname:'/dist/'
                            })
                        }
                    }
                ]
            }
        ]
    },
    devServer: {
        publicPath: '/dist/',
        historyApiFallback: true,
        openPage: 'dist/',
        inline: true,
        port: 8080,
        hot: true
    }
}
...

热替换处配置进行了修改,去除了 contentBase: './dist', 的配置,会导致页面URL丢失 dist 这层路径,引用绝对地址的资源无法找到,故改为以上配置。

html-loader 使用中发现 js 优化完不能自动引入 html 页面。(当然可以在页面中自己手动引入,但是文件生成 hash 时就杯具了。也可以使用 html-loaderattrs 属性获取 script:src 获取地址,但是这样 entry 配置中的 chunk 便显得毫无意义,这种做法仅仅是将将 webpack 当做一个压缩工具,而非模块化打包工具。)


总结

通过对 html-loaderloader 的学习使用了解了如何处理其他静态资源文件的方法,也解决了笔记(一)中当一个页面如果引用多个 css 文件,该如何保留其原有 css 数量而不进行合并,通过 extra-loader + file-loader 进行分离操作。
然而过程中也遇到了困难,如何处理图片的路径问题,以及使用 html-loader 要怎么自动引入 js 文件的问题。
下章尝试更方便的形式构建页面并且自动引入静态资源和 js


尾巴

不得不吐槽 webpack 的官网阅读起来真的很扎心,搜索一下跳转到英文页面,翻译里也大片英文,指引看起来也各种调戏,原先没有中文站的时候 巨巨 们都是怎么坚持下来的,顶礼膜拜!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • Webpack学习总结 此文只是自己学习webpack的一些总结,方便自己查阅,阅读不变,非常抱歉!! 下载安装:...
    Lxs_597阅读 909评论 0 0
  • —— 踩坑计划第一步 目录一览 webpack3.0学习笔记(一)webpack3.0学习笔记(二)webpack...
    曲终人散Misery阅读 1,392评论 1 7
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,081评论 7 35
  • 心里堵的难受。 王焕添,我爱你。我爱你。我爱你。
    蓬蓬蓬的毛毛熊阅读 116评论 1 0