资源管理

提示:

  1. 版本问题

本文基于 webpack 2.x 版本。webpack 2.x 相比 webpack 1.x 有重大改变。所以,如果你的项目中已使用了 webpack 1.x ,本教程的示例将不适用,请慎重。

如果铁了心要升级 webpack ,请参考 webpack 官方文档 - 从 v1 迁移到 v2

  1. 阅读建议

阅读本文前,建议先阅读 Webpack 概念 。

webpack 的优势

webpack 最重要的功能就是资源管理。

JavaScript 世界已有好几个有名的资源管理工具,webpack 有什么独到之处呢?

webpack 出现之前,前端开发人员会使用 gruntgulp 等工具来处理这些 web 资源,如样式文件(例如 .css.less.sass),图片(例如 .png.jpg.svg),字体(例如 .woff.woff2.eot)和数据(例如 .json.xml.csv)等,并将它们从 /src 文件夹移动到 /dist 或 /build 目录中。

而 webpack 从 entry(入口) 开始,访问应用程序,并动态打包(dynamically bundle)所有依赖项。这是极好的创举,因为现在每个模块都可以明确表述它自身的依赖,这可以避免打包未使用的模块。

Loader

Loader(加载器) 用于对模块的源代码进行转换。

使用加载器一般遵循几步:

  1. 安装加载器
  2. 配置 Loader
  3. 引用资源文件

安装加载器

根据需要加载的资源文件,选择下载对应的加载器。

$ npm install --save-dev css-loader

更多 webpack 可用Loader 请查看:webpack loaders

配置 Loader

​️ 注意:

webpack 2.x 版本的 Loader 配置和 webpack 1.x 版本差别很大。

Loader 在 webpack.config.js 文件的 module 属性中配置。

资源类型对应单一加载器

module: {rules: [{test: /\.css$/, loader: 'css-loader'}]
},

资源类型对应多个加载器

module: {rules: [{test: /\.css$/,use: ["style-loader", "css-loader"]}]
},

加载器含配置选项

module: {rules: [{test: /\.css$/,use: [{ loader: 'style-loader' },{loader: 'css-loader',options: {modules: true}}]}]
},

引用资源文件

完成上两步后,就可以在 JavaScript 中使用 importrequire 关键字引用相应类型资源文件。

import './index.css';
require('./index.css');

Plugin

Plugin(插件) 用于解决 Loader 无法解决的问题,它是 Loader 的辅助。

由于 plugin 可以携带参数/选项,你必须在 wepback 配置中,向 plugins 属性传入 new 实例。

安装插件

webpack 自身包含了一些常用插件,你可以通过 webpack 来引用。除此之外的插件,使用前需要安装

$ npm install --save-dev html-webpack-plugin OpenBrowserPlugin

更多 webpack Plugins 可以查看: webpack plugins

配置 Plugin

const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const OpenBrowserPlugin = require('open-browser-webpack-plugin');module.exports = {// 附加插件列表plugins: [// 压缩 js 插件new webpack.optimize.UglifyJsPlugin({compress: {warnings: false}}),// 用于简化 HTML 文件(index.html)的创建,提供访问 bundle 的服务。new HtmlWebpackPlugin({title: "react-step-by-step",template: "./index.html"}),// 自动打开浏览器new OpenBrowserPlugin({url: "http://localhost:8080"})]
};

加载资源专题

加载 React

很多浏览器并不识别 React 语法,为了让浏览器支持,你需要使用 babel-loader 解释器来转义 React 语法为普通的 Javascript 语法。

注意:

官方推荐 babel-loader 和 webpack 的对应版本

webpack 1.x | babel-loader <= 6.x

webpack 2.x | babel-loader >= 7.x (推荐)(^6.2.10 也可以运行,但会有不赞成的警告(deprecation warnings))

首先,安装需要使用的库:

$ npm install --save-dev babel-loader babel-preset-es2015 babel-preset-react

babel-preset-xxx 表示你希望转义的语法。

webpack.config.js 中的模块配置如下:

// 关于模块配置
module: {// 模块规则(配置 loader、解析器等选项)rules: [// 这里是匹配条件,每个选项都接收一个正则表达式或字符串// test 和 include 具有相同的作用,都是必须匹配选项// exclude 是必不匹配选项(优先于 test 和 include)// 最佳实践:// - 只在 test 和 文件名匹配 中使用正则表达式// - 在 include 和 exclude 中使用绝对路径数组// - 尽量避免 exclude,更倾向于使用 include{// 语义解释器,将 js/jsx 文件中的 es2015/react 语法自动转为浏览器可识别的 Javascript 语法test: /\.jsx?$/,include: path.resolve(__dirname, "app"),// 应该应用的 loader,它相对上下文解析// 为了更清晰,`-loader` 后缀在 webpack 2 中不再是可选的// 查看 webpack 1 升级指南。loader: "babel-loader",// loader 的可选项options: {presets: ["es2015", "react"]},},]
},

示例DEMO04: (DEMO / SOURCE)

加载 CSS

为了从 JavaScript 模块中 import 一个 CSS 文件,你只需要在 module 中安装并添加 style-loader 和 css-loader 。

$ npm install --save-dev style-loader css-loader

webpack.config.js

module.exports = {//...module: {rules: [{test: /\.css$/,use: ['css-loader','style-loader']}]},//...
}

好了,此时你就可以在代码中通过 import './style.css' 的方式引入 CSS 文件。

其余,加载 less,sass 等样式文件也是大同小异,不一一细说。

示例DEMO06: (DEMO / SOURCE)

加载图片

如何打包、加载图片呢?你可以使用 file-loader来指定要加载的图片。

$ npm install --save-dev file-loader

webpack.config.js

module.exports = {//...module: {rules: [{test: /\.(png|svg|jpg|gif)$/,use: ['file-loader']}]},//...
}

然后,你可以通过 import imgBig from './lion.png' 的方式引入图片。例:

import React from 'react';
import imgBig from './lion.png';class Welcome extends React.PureComponent {render() {return (<div><h1>Hello, {this.props.name}</h1><img src={imgBig} /></div>);}
}
export default Welcome;

压缩图片

这还不算完,日常开发中,经常会遇到有些图片文件过大的问题,这会影响你的 app 的加载速度。webpack 提供了压缩图片的方法帮你解决图片大的问题。

首先,你需要安装 image-webpack-loader

$ npm i --save-dev image-webpack-loader

接下来,修改 webpack.config.js

{// 图片加载 + 图片压缩test: /\.(png|svg|jpg|gif)$/,loaders: ["file-loader",{loader: "image-webpack-loader",query: {progressive: true,pngquant: {quality: "65-90",speed: 4}}}]
}

示例DEMO07: (DEMO / SOURCE)

加载字体

那么,像字体这样的其他资源如何处理呢?file-loader 和 url-loader 可以接收并加载任何文件,然后将其输出到构建目录。这就是说,我们可以将它们用于任何类型的文件,包括字体:

webpack.config.js

module.exports = {//...module: {rules: [{test: /\.(woff|woff2|eot|ttf|svg)$/,use: ['file-loader']}]},//...
}

一切就绪后,你可以在 css 文件中这样引入字体:

@font-face {font-family: 'MyDiyFont';src: url('./font/iconfont.eot'); /* IE9*/src: url('./font/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */url('./font/iconfont.woff') format('woff'), /* chrome、firefox */url('./font/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/url('./font/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
}h1 {font-family: 'MyDiyFont';font-size: 24px;
}p {font-family: 'MyDiyFont';font-size: 18px;
}

然后,相对路径,会被替换为构建目录中的完整路径/文件名。

示例DEMO08: (DEMO / SOURCE)

Webpack 系列教程

欢迎阅读其它内容:

  • Webpack 概念
  • Webpack 入门
  • Webpack 资源管理
  • Webpack 代码分离
  • Webpack 开发工具

Webpack 资源管理相关推荐

  1. webpack资源管理

    一.概况 ①webpack不仅可以打包JavaScript模块,甚至它把网页开发中的一切资源的都可以当作模块来打包处理 ②但是webpack本身不支持,它只是一个打包平台,其他资源,例如css.les ...

  2. Webpack 代码分离

    Webpack 代码分离 ? 提示: 版本问题 本文基于 webpack 2.x 版本.webpack 2.x 相比 webpack 1.x 有重大改变.所以,如果你的项目中已使用了 webpack ...

  3. 基于webpack搭建前端工程解决方案探索

    关于前端工程 \\ 下面是百科关于"软件工程"的名词解释: \\ \ 软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科. \ \\ 其中,工程化是方法,是 ...

  4. webpack:两小时极速入门

    目录 webpack webpack简介 webpack起步 webpack:管理静态资源 webpack:加载CSS资源 webpack:加载图片资源 webpack:加载字体资源 webpack: ...

  5. Webpack 概念

    概念 webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图表(dependency ...

  6. 十次方需求分析与技术架构、Node.js、包资源管理器NPM、Webpack

    1 十次方需求分析与技术架构 1.1 十次方是个什么样的网站 <十次方>是程序员的专属社交平台,包括头条.问答.活动.交友.吐槽.招聘六大 频道.如图所示: 十次方名称的由来:2的10次方 ...

  7. Webpack中Loader和Plugin的区别和编写思路

    由于webpack基于发布订阅模式,在运行的生命周期中会广播出许多事件,插件通过监听这些事件,就可以在特定的阶段执行自己的插件任务 一.区别 前面两节我们有提到Loader与Plugin对应的概念,先 ...

  8. webpack基础概念

    中文文档:https://webpack.docschina.org/concepts/ 一个现代 JavaScript 应用程序的静态模块打包器(static module bundler). 在 ...

  9. 用vue+webpack搭建的前端项目结构

    上个项目第一次用到vue+webpack,也是我第一次尝试自动化.模块化的开发方式,总的来说就是结构太烂,开发体验差,效率低,难维护.细数的罪状有如下几条 没有servies层,全部ajax接口都和逻 ...

最新文章

  1. redis报错Windows error 0x70--记录一次服务器雪崩异常
  2. windows下pycharm连接vagrant的python环境
  3. 微软老毛病还没改:Win10版本多达七个 咋选?
  4. 第一个 python for maya
  5. 使用LSTM进行情感分析
  6. SAP OData实现错误消息:OPPORTUNITIES_GET_ENTITY not implemented in data provider class
  7. Visual Studio 2017发布会:黄金时代的家族聚会
  8. 如何删除打印队列中的任务
  9. Twow ndows,笔者教您syswow64 【设置步骤】 的详细方法_
  10. Debugging a Create React App with VS Code
  11. 从零开始的车牌识别课题设计(一)
  12. 中国科学院研制的开放式超导磁共振成像磁体系统
  13. [每日学习3.26/3.27] 游戏研发面经学习 - 阿V
  14. TortoiseSVN配置
  15. centos7搭建webpack
  16. 一款Java开源的SpringBoot即时通讯IM 聊天系统
  17. 正则表达式匹配非某字符串的情况
  18. SMTP与POP的默认端口号
  19. 网工自动化运维,转身多么重要
  20. 服装办理软件的数据预备过程

热门文章

  1. mongodb数据库淘汰_红帽彻底不跟MongoDB玩了,只认PostgreSQL
  2. python列表方法语句_Python中列表和元组的相关语句和方法讲解
  3. linux pcie热插拔驱动_Linux安装TLP-高级电源管理工具
  4. 想要学习Python爬虫的你,真的了解爬虫最基础的知识储备吗?
  5. 小白兔写话_小学二年级写话-我的小白兔
  6. JSP笔记-XML 数据处理
  7. centos8配置防火墙
  8. 【Java】剑指 Offer II 022. 链表中环的入口节点
  9. 如何在android中水平放置三张图片,Android ACTION_VIEW多张图片
  10. mysql getconnection 如何关闭连接_【MySQL】使用连接池获取Connection执行sql以及mybatis事务注意事项...