webpack踩坑之路 (2)——图片的路径与打包

webpack踩坑之路 (2)——图片的路径与打包

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle)。下面我们就来分析下在webpack项目中图片的应用场景。

在实际生产中有以下几种图片的引用方式:

1. HTML文件中img标签的src属性引用或者内嵌样式引用

<img src="photo.jpg" />
<div style="background:url(photo.jpg)"></div>

2. CSS文件中的背景图等设置

.photo {
    background: url(photo.jpg);
}

3. JavaScript文件中动态添加或者改变的图片引用

var imgTempl = ‘<img src="photo.jpg" />‘;
document.body.innerHTML = imgTempl;

4. ReactJS中图片的引用

import React from ‘react‘;
import ReactDOM from ‘react-dom‘;

class App extends React.Component {
    render() {
        return (<img src=‘photo.jpg‘ />);
    }
}

ReactDom.render(<App />, document.querySelector(‘#container‘));

url-loader

在 webpack 中引入图片需要依赖 url-loader 这个加载器。

安装:

npm install url-loader --save-dev

当然你可以将其写入配置中,以后与其他工具模块一起安装。

在 webpack.config.js 文件中配置如下:

module: {
  loaders: [
    {
      test: /\.(png|jpg)$/,
      loader: ‘url-loader?limit=8192‘
    }
  ]
}    

test 属性代表可以匹配的图片类型,除了 png、jpg 之外也可以添加 gif 等,以竖线隔开即开。

loader 后面 limit 字段代表图片打包限制,这个限制并不是说超过了就不能打包,而是指当图片大小小于限制时会自动转成 base64 码引用。上例中大于8192字节的图片正常打包,小于8192字节的图片以 base64 的方式引用。

url-loader 后面除了 limit 字段,还可以通过 name 字段来指定图片打包的目录与文件名:

module: {
  loaders: [
    {
      test: /\.(png|jpg)$/,
      loader: ‘url-loader?limit=8192&name=images/[hash:8].[name].[ext]‘
    }
  ]
}

上例中的 name 字段指定了在打包根目录(output.path)下生成名为 images 的文件夹,并在原图片名前加上8位 hash 值。

例:工程目录如下

在 main.css 中引用了同级 images 文件夹下的 bg.jpg 图片

background-image: url(./images/bg.jpg);

通过之前的配置,使用 $ webpack 命令对代码进行打包后生成如下目录

打包目录中,css 文件和 images 文件夹保持了同样的层级,可以不做任务修改即能访问到图片。区别是打包后的图片加了 hash 值,bundle.css 文件里引入的也是有hash值的图片。

background-image: url(images/f593fbb9.bg.jpg);

(上例中,使用了单独打包css的技术,只是为了方便演示)

publicPath

output.publicPath 表示资源的发布地址,当配置过该属性后,打包文件中所有通过相对路径引用的资源都会被配置的路径所替换。

output: {
  path: ‘dist‘,
  publicPath: ‘/assets/‘,
  filename: ‘bundle.js‘
}

main.css

background-image: url(./images/bg.jpg);

bundle.css

background-image: url(/assets/images/f593fbb9.bg.jpg);

该属性的好处在于当你配置了图片 CDN 的地址,本地开发时引用本地的图片资源,上线打包时就将资源全部指向 CDN 了。

但是要注意,如果没有确定的发布地址不建议配置该属性,否则会让你打包后的资源路径很混乱。

JS中的图片

初用 webpack 进行项目开发的同学会发现:在 js 或者 react 中引用的图片都没有打包进 bundle 文件夹中。

正确写法应该是通过模块化的方式引用图片路径,这样引用的图片就可以成功打包进 bundle 文件夹里了

js

var imgUrl = require(‘./images/bg.jpg‘),
    imgTempl = ‘<img src="‘+imgUrl+‘" />‘;
document.body.innerHTML = imgTempl;

react

render() {
    return (<img src={require(‘./images/bg.jpg‘)} />);
}

HTML中的图片

由于 webpack 对 html 的处理不太好,打包 HTML 文件中的图片资源是相对来说最麻烦的。这里需要引用一个插件—— html-withimg-loder

$ npm install html-withimg-loader --save-dev

webpack.config.js 添加配置

module: {
  loaders: [
    {
      test: /\.html$/,
      loader: ‘html-withimg-loader‘
    }
  ]
}

在 bundle.js 中引用 html 文件

import ‘../index.html‘;

这样 html 文件中的图片就可以被打包进 bundle 文件夹里了。

时间: 2024-10-04 19:41:19

webpack踩坑之路 (2)——图片的路径与打包的相关文章

webpack踩坑之路——构建基本的React+ES6项目

webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是现在很多潮流 programmer 的追求. 废话不多,下面就就看下如何从0搭起我们的构建工具. 安装 全局安装webpack,如果安装后还是提示没有webpack commond,可以尝试通过超级管理员身份安装. $ npm install webpack -g $ sudo npm install webpack -g  或者在项目里进行安装 $ npm install webpack --sa

html2canvas的踩坑之路

html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品上线周期. html2canvas介绍 html2canvas的详细介绍可以点击这里查看,其实简单来说就是通过canvas将HTML生成的DOM节点绘制到画布上,再可以通过自己的需求转换成图片.所以官方文档也说了,最后生成的效果不是100%相同的,这一点大家要有心理准备,无论怎样,一点点小瑕疵是肯定

踩坑之路_&quot;var name = &#39; &#39;;&quot;_迷之BUG

情景介绍:最近写一个拖拽生成图表的工具,自己的思路每次mousedown的时候动态将this的name属性值赋值给全局中变量(自己手贱测试时直接将变量名命名为了'name',一大波bug还有30s到达战场.....),mouseup时更具当前的全局属性值判断生成的图表类型:就酱... 首先给大家贴个html布局,有图有真相,(虽然简单的要死)正常结果应该是:拖拽 '折线图' 右侧生成折线图,柱状图生成柱状图: 然后我帅气的用 var name = ''; 从此开启bug模式: js代码如下: 出

webpack踩坑

运行效率 如果项目是多入口配置,在本地开发阶段不需要每次都跑全部的 可以获取到运行命令行参数决定,跑哪些页面,加快速度 process.env.npm_config_argv或者使用yargs这个npm包获取命令行传入的参数 1 2 3 4 5 6 7 var scriptArg = process.env.npm_config_argv && JSON.parse(process.env.npm_config_argv); var targetDir = scriptArg &&

vue+ vue-router + webpack 踩坑之旅

说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少不了res.render("xx",data)    这句话的意思就是去查找相应的模板文件然后在用数据去渲染在将渲染好的页面去返回给浏览器,给浏览器去解析,渲染模板其实就是做的替换字符串+拼接字符串的活  各种的模板引擎也有各个优化的点(比如可以将对应的模板编译的函数保存在内存中,然后在通

Java踩坑之路

陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一次接触Java,是写一个小网站,当时用servlet+tomcat做服务端,数据库是mysql.那时我对于网站应用的概念一片空白,之前接触的都是C++和MFC写桌面程序.我花了一周时间看完了<java servlet programming>这本书,然后我就开始写代码了.但是,真的当我写代码的时候

opencv入门踩坑之路(一)

因为找了个实验室搬砖,所以我开始学opencv和pytorch了 嘿嘿嘿,感觉记录踩过的坑会很有意思嘻嘻嘻 首先是安装opencv,这个贼简单,我用的win10 直接命令行 pip install opencv-python,如果需要安装特定版本,可以pip install opencv-python==版本号,但是直接用默认安装最新版,它不香吗? 接下来测试一下是否成功 版本号出来就说明成功啦 接下来跑第一个demo 这个demo的作用是显示一张图片 from cv2 import cv2 a

react js踩坑之路(一)

讲真如果让我选个主流的mvvm框架做项目,我会果断选择vue,写起来不要太方便哦.但是,pc端要兼容ie8这个坑货,所以pc端只好选用react了啦~移动端果断用vue咯 再来讲讲构建工具,还是基于webpack 和 gulp,然后将react和vue 分开打包相关配置如下 webpack会依次将公用的打包到vendors.js .react的打包到react中,vue相关的打包到vue中,最后剩下的部分打包到load.js中. 下面直接用react实现一个后台页面的container组件吧,这

jQuery升级踩坑之路

1.使用了被废弃的jQuery.browser属性 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9. 如果要全面支持 IE,并混合使用 jQuery 1.9 和 2.0, 官方的解决方案是: <!--[if lt IE 9]> <script src='jquer