前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【第9期】webpack入门学习手记(三)

【第9期】webpack入门学习手记(三)

作者头像
siberiawolf
发布于 2020-03-24 09:12:28
发布于 2020-03-24 09:12:28
1.1K00
代码可运行
举报
文章被收录于专栏:前端修炼之路前端修炼之路
运行总次数:0
代码可运行

由于微信不允许外部链接,你需要点击页面尾部左下角的阅读原文,才能访问文中的链接。

距离上一次更新这个系列,过去了两天。最近实在是有点忙,没有挤出时间整理。感觉日更还真是困难?

以下是正文。

管理资源

如果看过之前的系列文章,应该会有一个学习项目webpackStudy,可以从文章下方找到之前的链接。官网给出的示例都是在一个项目中的html页面、package.jsonwebpack.config.js中进行修改。我为了保留每一小节的代码,并没有按照官网给出的方案处理,而是重新新建的配置文件。可以通过腾讯云开发者平台查看源码。

webpack有两大特色:

  • 动态打包。在webpack中,每个模块都会声明所引用的依赖,这样就避免了打包没有使用到的模块。另外通过配置,可以避免重复打包相同的引用,提高打包效率。
  • 强大的loader。通过loader,webpack可以引入任何其他的非JavaScript文件。例如,加载css、图片、字体、JSONXML等。

加载css

首先安装两个loader:style-loadercss-loader。执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save-dev style-loader css-loader

注意 建议使用淘宝 NPM 镜像

然后在webpack.config.js中添加使用loader的规则。

webpack.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    }]
  }
};

添加module.rules表示要使用的loader规则。test属性使用正则表达式匹配任何的.css文件。use属性通过一个数组,表示匹配到的文件使用哪些需要加载的loader,这里就是style-loadercss-loader

接下来在项目中添加一个style.css文件,并修改下index.js

project

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|- /src
+   |- style.css
    |- index.js
  |- /node_modules

src/style.css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.hello {
  color: red;
}

src/index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import _ from 'lodash';
import './style.css';

function component() {
  let element = document.createElement('div');

  // Lodash, currently included via a script, is required for this line to work
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  return element;
}

document.body.appendChild(component());

index.js文件中,通过importstyle.css文件引入。在style.css中添加了一个hello样式。index.js文件中,直接使用了这个css样式。

也就是说,在js文件中,直接使用了css代码。感觉非常酷~

然后执行打包命令,看看有什么变化~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run build

此时用浏览器打开index.html,会发现之前的Hello webpack变成了红色。请注意,之前我们并没有在index.html中引入任何的css样式。用浏览器检查一下页面,就会知道webpack是怎么做到的了。

说明webpack将css代码自动添加到head标签中了,非常的智能化~

加载图片

接下来尝试下加载图片和在css中引用背景图片。这时我们要使用file-loader

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save-dev file-loader

webpack.config.js中添加一段使用loader的配置。

webpack.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    },
    {
      test: /\.(png|svg|jpg|gif)$/,
      use: ['file-loader']
    }]
  }

然后在项目中添加一张图片。

project

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|- /src
+   |- icon.jpg
    |- style.css
    |- index.js
  |- /node_modules

最后,添加引用图片和使用背景图片代码。

src/index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import _ from 'lodash';
import './style.css';
import Icon from './icon.jpg';

function component() {
  let element = document.createElement('div');

  // Lodash, currently included via a script, is required for this line to work
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  // Add the image to our existing div.
  var myIcon = new Image();
  myIcon.src = Icon;

  element.appendChild(myIcon);

  return element;
}

document.body.appendChild(component());

src/style.css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.hello {
  color: red;
  background: url(./icon.jpg);
}

重新执行打包命令npm run build,然后打开index.html文件,会发现已经能显示添加的图片和设置的背景图了。

这里还有一个小细节是,如果查看页面会发现,图片名称已经被修改为类似14a53ef4a1ced4a4a6f7161f51c6870e.jpg这样的名字了。说明webpack处理了添加的图片,并重新命名了。 关于更多的图片压缩和优化,以后再继续整理。

加载字体

加载字体与加载图片和css没有什么区别。我找了一个ttf格式的字体来学习这个过程。首先告诉webpack字体文件使用file-loader进行加载。

webpack.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    },
    {
      test: /\.(png|svg|jpg|gif)$/,
      use: ['file-loader']
    },
    {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: ['file-loader']
    }]
  }

然后项目中引入字体:

project

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|- /src
+   |- my-font.ttf
    |- icon.png
    |- style.css
    |- index.js
  |- /node_modules

最后使用字体。

src/style.css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@font-face{
  font-family: 'myFont';
  src: url('./my-font.ttf') format('ttf');
  font-weight: 600;
  font-style: normal;
}
.hello {
  color: red;
  font-family: 'myFont';
  background: url(./icon.jpg);
}

重新打包npm run build,打开index.html文件,然后查看页面,会发现字体已经使用上了。与图片相同,字体文件也被wepack重命名了。

加载数据

webpack可以加载任何类型的数据,例如JSON, CSV, TSV, 和XML。webpack默认内置了JSON加载数据。

照着官网的例子一步步来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save-dev csv-loader xml-loader

webpack.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module: {
    rules: [{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    },
    {
      test: /\.(png|svg|jpg|gif)$/,
      use: ['file-loader']
    },
    {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: ['file-loader']
    },
    {
      test: /\.(csv|tsv)$/,
      use: ['csv-loader']
    },
    {
      test: /\.xml$/,
      use: ['xml-loader']
    }]
  }

添加一个测试用的xml数据:

project

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|- /src
+   |- data.xml
    |- my-font.woff
    |- my-font.woff2
    |- icon.png
    |- style.css
    |- index.js
  |- /node_modules

data.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Mary</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Call Cindy on Tuesday</body>
</note>

src/index.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import _ from 'lodash';
import './style.css';
import Icon from './icon.jpg';
import Data from './data.xml';

function component() {
  let element = document.createElement('div');

  // Lodash, currently included via a script, is required for this line to work
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');
  element.classList.add('hello');

  // Add the image to our existing div.
  var myIcon = new Image();
  myIcon.src = Icon;

  console.log(Data);

  element.appendChild(myIcon);

  return element;
}

document.body.appendChild(component());

目前执行到这里一切看起来都很容易。创建一个data.xml文件,然后加一些假数据,最后在index.js中打印这个数据。但是当我执行打包命令npm run build时,一切都不那么的和谐了。出现了如下的错误:

build error

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> webpackStudy@1.0.0 build /Users/yyy/Documents/work/workspace/webpackStudy
> webpack --config webpack.config.js

/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.3.1.2@webpack-cli/bin/cli.js:244
                                throw err;
                                ^

Error: Cannot find module '@webassemblyjs/helper-code-frame'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
    at Function.Module._load (internal/modules/cjs/loader.js:529:25)
    at Module.require (internal/modules/cjs/loader.js:658:17)
    at require (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.2.0.2@v8-compile-cache/v8-compile-cache.js:159:20)
    at Object.<anonymous> (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.1.7.11@@webassemblyjs/wast-parser/lib/grammar.js:8:24)
    at Module._compile (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.2.0.2@v8-compile-cache/v8-compile-cache.js:178:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:733:10)
    at Module.load (internal/modules/cjs/loader.js:620:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:560:12)
    at Function.Module._load (internal/modules/cjs/loader.js:552:3)
    at Module.require (internal/modules/cjs/loader.js:658:17)
    at require (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.2.0.2@v8-compile-cache/v8-compile-cache.js:159:20)
    at Object.<anonymous> (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.1.7.11@@webassemblyjs/wast-parser/lib/index.js:11:38)
    at Module._compile (/Users/yyy/Documents/work/workspace/webpackStudy/node_modules/.2.0.2@v8-compile-cache/v8-compile-cache.js:178:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:733:10)
    at Module.load (internal/modules/cjs/loader.js:620:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:560:12)

这就很奇怪了,意思是说找不到一个模块。经过一番苦苦查找,终于知道了原因。

需要将webpack4版本 降到webpack3版本。我找到的版本是3.11.0。我将wepack卸载掉,然后安装这个版本之后,再次打包,就成功了。

从上图的中的打印数据中可以发现,我们的xml文件已经被解析成了json格式的数据。

说明: 我将本小节代码托管到了腾讯云开发者平台,如果需要查看这节内容,请查找Asset Management目录即可。


以上就是指南手册中的Asset Management部分。总结一下主要内容:

  • 加载CSS
  • 加载图片
  • 加载字体
  • 加载数据

下一篇笔记整理webpack官方文档的指南手册剩余部分,敬请关注。

(待续)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端修炼之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
webpack打包原理入门探究(一)
周五晚上发布了计划,计划一出来,就要坚定执行,不然怎么算得上男人这个称号呢?昨天已经研究了 vue 一些常用的 组件,也已经整理到自己的组件学习库中了,喜欢的伙伴可以点赞,收藏加评论,一起进步吧
公众号---人生代码
2020/06/02
4270
webpack打包原理入门探究(一)
webpack 从入门到放弃
Webpack + ES6 已经成为目前最流行的前端解决方案,本文是 Webpack2 学习教程。
李振
2021/11/26
6140
webpack 入门教程
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
老马
2018/08/20
4.1K0
webpack 入门教程
Webpack4教程 - 第二部分,使用loader处理scss,图片以及转换JS
今天继续我们的Webpack 4入门教程。在介绍了Webpack的基本概念之后,是时候更深入一点了。这次我们会涉及Webpack中非常强大的一个东西:loader。首先,我们会学习如何使用那些可用的loader。它将包括如何处理css、scss、图片以及对老版本的JavaScript语言的转换。让我们开始吧!
葡萄城控件
2018/09/14
9010
深入浅出webpack的最佳实践!
导语 | 本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯云前端开发Jou。 自从加入腾讯,作者便一直在使用webpack,因此,本文主要整理一下webpack相关的知识点,由浅入深,后续会一直更新分享,以便对此方面感兴趣的开发者们提供一些经验和帮助。欢迎点击文末「阅读原文」访问腾讯云开发者社区,查看作者作品~ 核心概念 (一)Module
腾讯云开发者
2022/08/31
6940
深入浅出webpack的最佳实践!
Webpack基本使用
Webpack介绍:主要用于web项目中打包资源进行自动构建,Webpack将所有资源视为JS的模块来进行构建,所以对于CSS,Image等非JS类型的文件,Webpack会使用相应的加载(loader)器来加载成其可识别的JS模块资源,通过配置一些信息,就能将资源进行打包构建,更好地实现前端的工程化 Webpack安装 本地安装: npm install -D webpack -D 实际上是简写 --dev-save 如果你使用Webpack 4+ 版本, 你还需要安装CLI. npm ins
一个淡定的打工菜鸟
2018/09/06
4630
Webpack基本使用
【第10期】webpack入门学习手记(四)
在程序入口文件中,引用这个文件。这个文件的内容,对上一节的代码做了修改。只保留了加载css样式的代码。
siberiawolf
2020/03/24
4600
【第10期】webpack入门学习手记(四)
一小时的时间,上手 Webpack
为什么要用构建工具?如果你只会js+css+html,最多再加上jquery,那么当你听到构建工具这个说法是不是蒙的?这种情况下我不建议你学习webpack,建议你学下 vue 或者 react 框架,这两个框架都有自己的脚手架,所谓脚手架就是别人用构建工具帮你搭好了原始项目,你可以在不懂构建工具的情况下进行前端开发。不过这就是初级前端的基本工作,给我一个环境,让我安心的写业务代码。
一只图雀
2020/04/07
8280
webpack 基础知识整理
webpack是一个 模块打包工具,支持所有的打包语法,比如 ES Module、CommonJS、CMD、AMD。初期的webpack是用来模块打包js的,发展到现在,已经可以打包很多种文件类型,比如 css、img 。
神葳
2021/01/22
1.4K0
webpack资源管理
书接上文,首先对上次的项目进行改造,参考:https://webpack.docschina.org/guides/asset-management/
阿超
2022/09/23
1.5K0
webpack资源管理
webpack+es2015+react+Ant Design纲领
最近TWaver 3D机房项目打算使用Ant Design来重构后端管理页面,Ant Design 团队不是很熟悉,webpack react等用的不多,所以自己花了一天时间,把相关知识点撸了一遍,给团队做了个培训。 下面主要是一个培训的纲领,整个流程可以通畅的跑下来; 主要是webpack+es2015+react+Ant Design。 当然,ant design 自己有一套框架 打包平台,有兴趣的也可以研究。
用户3158888
2019/05/30
1.2K0
webpack4 入门
源码地址 https://github.com/lilugirl/learn-webpack4/tree/master/3
lilugirl
2019/10/08
5530
webpack 4.x 初级学习记录
以上就是4版本之前的使用方式,但是这种方式在4版本中就不能使用了,4版本有自己的新的方式
SpiritLing
2018/10/10
7540
前端工程化 - webpack 基础
默认配置文件 webpack.config.js,可以通过 webpack --config 指定配置文件
Cellinlab
2023/05/17
3100
webpack安装配置指令
进行重新加载编译。实际就是将浏览器不认识的语法编译成浏览器认识的语法。比如less编译成css,ES6 语法 转成 ES5等等。
子舒
2022/06/09
4340
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
1.8K0
【Webpack】319- Webpack4 入门手册(共 18 章)(上)
【Cute-Webpack】Webpack4 入门手册(共 18 章)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/15
2.4K1
webpack快速构建项目
webpack是什么我在这里就不多说了,实在不知道的可以直接在去搜一下,都一大堆答案。关于用webpack怎么构建项目,方法也是多种多样,五花八门。今天,我就写下我平常构建项目的方式,这个方式我觉得比较便捷和简单粗暴,如果有什么要指出的,也欢迎大家评论,毕竟我也只是一个前端新人。
守候i
2018/08/22
8430
webpack快速构建项目
从零开始学VUE之Webpack(Html打包插件的使用)
看到的错误大概是不能读取属性中的 initialize方法,是一个没有定义的,经过查看源码,发现在最新的版本中确实没有这个方法了,后来看了下老师的版本是3.2.0,我的是5.3.1
彼岸舞
2021/06/07
8650
从零开始学VUE之Webpack(Html打包插件的使用)
webpack5快发布了,你还没用过4吗?
webpack5 预计会在 2020 年年初发布,之前从 alpha 版本就有关注,本次重点更新在长期缓存,tree shakking 和 es6 打包这块。具体变更可以参考https://github.com/webpack/changelog-v5/blob/master/README.md。
前端森林
2020/04/23
1.6K0
webpack5快发布了,你还没用过4吗?
相关推荐
webpack打包原理入门探究(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验