当前位置: 首页 > 编程日记 > 正文

Loader 入门【Webpack Book 翻译】

原文链接:https://survivejs.com/webpack...
翻译计划:https://segmentfault.com/a/11...

附言:因为发现书中一些内容单独放出来会比较尴尬,所以会跳过部分章节,当然完整版会全部翻译,已经正在研究原版的网站搭建工程了
clipboard.png

Webpack 提供了多种配置模块 loader 的方法。 Webpack 2 开始通过引入 use 字段,简化了 loader 使用。在这里使用绝对路径是一个好主意,因为它们允许你在不影响构建的情况下移动配置。

另一种方法是设置 context 字段,因为这会产生类似的效果并影响 entry 和 loader 的路径解析。但是它对输出没有影响,你仍然需要使用绝对路径或 /

即使你设置了 includeexclude 规则,从 node_modules 加载的包仍然可以正常工作,因为它们已经被编译为开箱即用的代码。如果它们没这么做,那么你必须应用 Consuming Packages 章节中涵盖的技术。

T> include/exclude 在处理 node_modules 问题时非常方便,因为当你将 JavaScript 文件导入项目时,webpack 会默认处理并遍历已安装的包。为了让 webpack 不处理 node_modules,你需要使用 exclude。其他文件类型不会遇到此问题。

剖析 Loader

Webpack 通过 loader 支持多种格式的文件。此外,它支持一些开箱即用的 JavaScript 模块规范。文件格式不同,但思路都是一致的,你必须设置一个或多个 loader,并将它们与你的目录结构连接起来。

{pagebreak}

下例中 webpack 通过 Babel 处理 JavaScript:

webpack.config.js

module.exports = {...module: {rules: [{// **Conditions** to match files using RegExp, function.test: /\.js$/,// **Restrictions**// Restrict matching to a directory. This// also accepts an array of paths or a function.// The same applies to `exclude`.include: path.join(__dirname, "app"),exclude(path) {// You can perform more complicated checks  as well.return path.match(/node_modules/);},// **Actions** to apply loaders to the matched files.use: "babel-loader",},],},
};

T> 如果你对 RegExp 的匹配不熟悉,可以使用在线工具,例如 regex101,RegExr 或 Regexper。

Loader 的运算顺序

一定要记住 loader 总是从右到左,从下到上(拆开写的时候)进行运算的。把它看成函数比较容易理解所谓“从右到左运行”。你可以把 use: ["style-loader", "css-loader"] 看作 style(css(input))

要查看规则,请看以下示例:

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

根据从右到左的规则,可以等效拆分为:

{test: /\.css$/,use: "style-loader",
},
{test: /\.css$/,use: "css-loader",
},

强制执行顺序

尽管可以使用上述规则配置,但是也可以强制在常规规则之前之后应用特定规则。enforce 字段在这里可以派上用场。把他设置为 pre or post 以在其他 loader 之前或之后进行处理。

Lint 是一个很好的例子,因为 Lint 必须先于任何其他行为。enforce: "post" 倒是很少用到,这多是你想对构建结果进行检查时使用的。

{pagebreak}

基本语法如下:

{// Conditionstest: /\.js$/,enforce: "pre", // "post" too// Actionsuse: "eslint-loader",
},

如果你可以保证 test 中的 loader 顺序无误,那么可以不使用 enforce。不过使用 enforce 方便你把不同步骤的 loader 分离开来,更容易组织。

Loader 的传参

可通过 query 把参数传到 loader:

{// Conditionstest: /\.js$/,include: PATHS.app,// Actionsuse: "babel-loader?presets[]=env",
},

这种配置风格也适用于 entry 和 import,webpack 会处理他们。在某些个别情况下,这个写法能派上用场,但通常情况下最好使用以下更具可读性的方案。

{pagebreak}

传入对象到 use

{// Conditionstest: /\.js$/,include: PATHS.app,// Actionsuse: {loader: "babel-loader",options: {presets: ["env"],},},
},

如果你想使用多个 loader,你可以将一个对象数组传递给 use

{test: /\.js$/,include: PATHS.app,use: [{loader: "babel-loader",options: {presets: ["env"],},},// Add more loaders here],
},

{pagebreak}

使用函数在 use 字段添加分支

本书中,你在更高级别上进行环境配置。实现类似结果的另一个选择是在 use 处使用分支,因为 webpack 的 loader 定义接受函数作为参数,你可以通过此函数区分环境:

{test: /\.css$/,// `resource` refers to the resource path matched.// `resourceQuery` contains possible query passed to it// `issuer` tells about match context pathuse: ({ resource, resourceQuery, issuer }) => {// You have to return something falsy, object, or a// string (i.e., "style-loader") from here.//// Returning an array fails! Nest rules instead.if (env === "development") {return {use: {loader: "css-loader", // css-loader firstrules: ["style-loader", // style-loader after],},};}},
},

用心感受,这是组合配置的另一种手段。

内联式定义

尽管配置级 loader 定义更可取,但可以内联编写 loader 定义:

// Process foo.png through url-loader and other
// possible matches.
import "url-loader!./foo.png";// Override possible higher level match completely
import "!!url-loader!./bar.png";

这种方法的问题在你的源代码会与 webpack 耦合。相同的机制还适用于 entry:

{entry: {app: "babel-loader!./app",},
},

匹配文件的备选方法

test 结合 includeexclude 是匹配文件的最常用方法。这些字段接受以下数据类型:

  • test——匹配 RegExp,字符串,函数,对象或数组。
  • include——同上。
  • exclude——同上,输出与 include 相反。
  • resource: /inline/——匹配包含查询内容的资源路径。示例:/path/foo.inline.js, /path/bar.png?inline
  • issuer: /bar.js/——匹配从某处请求的资源。示例:如果 /path/foo.png/path/bar.js 请求,那么 /path/foo.png 将匹配。
  • resourcePath: /inline/——匹配包含查询内容的资源路径(不包括 query)。示例:/path/foo.inline.png
  • resourceQuery: /inline/——匹配包含查询内容的 query(不包括 query)。示例:/path/foo.png?inline

基于布尔值的字段可用于进一步进行约束:
Boolean based fields can be used to constrain these matchers further:

  • not——匹配给定条件(参见test表示接受的值)。
  • and——同时匹配一系列条件。
  • or——与数组中其中一个条件匹配。

基于 resourceQuery 加载

oneOf 字段可以根据资源相关匹配将 webpack 路由到特定的 loader:

{test: /\.png$/,oneOf: [{resourceQuery: /inline/,use: "url-loader",},{resourceQuery: /external/,use: "file-loader",},],
},

如果你需要在文件名中查询,应该使用 resourcePath 而不是 resourceQuery

{pagebreak}

基于 issuer 加载

issuer 基于资源的导入位置进行操作。以下示例改编自 css-loader issue 287,style-loader 将应用于 JavaScript 导入的 CSS 文件:

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

另一种方法结合了 issuernot

{test: /\.css$/,rules: [// CSS imported from other modules is added to the DOM{issuer: { not: /\.css$/ },use: "style-loader",},// Apply css-loader against CSS imports to return CSS{use: "css-loader",},],
}

了解 loader 行为

通过观察 loader 行为可以更深入地理解它们。 loader-runner 允许你在没有 webpack 的情况下单独运行它们。Webpack 在底层也是使用此软件包,Extending with Loaders 章节将会详细介绍它。

inspect-loader 可以监视 loader 之间传递的内容。将此 loader 添加到你的配置即可检查其中的数据流,而不必在 node_modules 中插入 console.log

总结

Webpack 提供了多种设置 loader 的方法,但在 webpack 4 中用好 use 就足够了。注意 loader 的处理顺序,这是很多常见的问题来源。

回顾一下:

  • Loaders 决定了 webpack 的模块解析机制匹配到文件时应该作何处理。
  • loader 定义包括用于匹配的条件(conditions),以及匹配成功需要进行的动作(actions)
  • Webpack 2 引入了use字段。它将以前的 loaderloaders 字段结合到了一起。
  • Webpack 4 提供了多种匹配和改变 loader 行为的方法。例如,你可以在匹配 loader 后进行 resource query 匹配,指引 loader 进行特定操作。

在下一章中,你将学习使用 webpack 加载图片。

相关文章:

backtrack X server 启动不了

本来安装好了啥事没有的。 自己硬想能不用打startx直接启动X server的 于是加了 if [ -z ... 的代码 到 ~/.xinitrc 结果X server就再也启动不了了 花了2个小时? 检索【inappropriate ioctl for device (25)】 有一篇文章提到了 xinitrc, 我才想起来好像是编辑了这个文件&…

【FFmpeg】windows下的库下载

1、官网 http://ffmpeg.org/ 2、点击下载,选择windows 左侧库下载,右侧源码下载 3、二进制库下载 官方网址:https://www.gyan.dev/ffmpeg/builds/#release-builds 4、gihub上的二进制镜像

19行关键代码,带你轻松入门PaddlePaddle单机训练

刚接触深度学习框架的同学可能会说新入手一个框架是不是会很难?NO,NO,NOPaddlePaddle的宗旨就是“easy to use!”PaddlePaddle是百度自研的集深度学习框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台,有全…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标,他们正在构建一个新工具,该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是,这不是一次直接进行的投票,而是基于你的应用程序正在使…

【FFmpeg】RTSP、RTMP相关命令及开源项目

一、RTSP转RTMP 海康摄像头:抓取 rtsp 流然后转换成 rtmp 推流出去 主码流 ffmpeg -i “rtsp://[用户名]:[密码]@192.168.1.100/h265/ch1/main/av_stream” -f flv -r 25 -s 1920x1080 -an rtmp://localhost/live/a ffmpeg -i “rtsp://[用户名]:[密码]@192.168.1.100:554/h2…

Day13 python基础---内置函数1

一,内置函数: 1.什么是内置函数 就是python给你提供的,拿来直接用的函数,比如print,input等等,截止到python版本3.6.2,现在pyhton一共为我们提供了69个内置函数。 2.作用域相关 # 作用域相关 ****** # globals() :返回…

百度大脑开放日第三期:四大全新平台、两大场景方案助力开发者逐梦 AI

人工智能正走在从技术攻坚到嵌入大众生活的历史进程中,这离不开千万开发者的助力,但开发者也需要“被赋能”。5 月 30 日,第三期百度大脑开放日在深圳微漾国际创客空间如期举行,再一次向开发者、行业人士展现了百度大脑的 AI 技术…

SQuirreL SQL Client 使用记录

如果您的工作要求您在一天之中连接许多不同的数据库 (oracle、DB2、mysql、postgresql、Sql Server等等),或者你经常需要在多个不同种类的数据库之间进行数导入导出。那么SQuirreL SQL Client 将会是比较理想的数据库客户端链接工具。 简单介…

使用Zabbix通过BMC管理口监控HP服务器

概述 本文的环境:Zabbix版本为3.4,一台Server,一台Porxy,一台agent。Porxy主动抓取agent的状态并sender到Server。 首先需要保证服务器的BMC口能够联网,并且拥有管理用户和密码,Proxy和agent能够保持联网。…

刚刚,百度宣布王海峰升任CTO

作者 | 夕颜、一一出品 | AI科技大本营(ID:rgznai100)导读:5 月 31 日,百度宣布,百度原高级副总裁王海峰升任百度 CTO,成为百度在组织大变革中一批“敢打硬仗”的代表人物得到晋升的典型。在百度人事动荡之…

【FFmpeg】结构体详解(一):AVCodec、AVCodecContext、AVCodecParserContext、AVFrame、AVFormatContext 、AVIOContext

FFmpeg结构体详解 一、FFmpeg中最关键的结构体之间的关系1、解协议(http,rtsp,rtmp,mms)2、解封装(flv,avi,rmvb,mp4)3、解码(h264,mpeg2,aac,mp3)4、存数据二、结构体详解1、AVCodec 是存储编解码器信息的结构体。1.1 enum AVMediaType type1.2 enum AVCodecID id1.3 co…

大一新生,你为何逃课?

昨晚不知在哪看到对现在大学生的描述,说现在的大学生30%的时间在应对无聊的思政课,30%的时间在忙着考英语等级,剩下40%的时间在忙着花前月下,“还忙不过来”,虽然不是全部大学生都这样,但也确实有不少的学生…

【FFmpeg】结构体详解(二):AVStream、AVPacket、AVOutputFormat

FFmpeg结构体详解 7、AVStream8、AVPacket9、AVOutputFormat7、AVStream AVStream 是存储每一个视频/音频流信息的结构体。 重要的变量如下所示: int index: 标识该视频/音频流 AVCodecContext *codec: 指向该视频/音频流的AVCodecContext(它们是一一对应的关系) AVR…

谷歌 Fuchsia 上手体验,将取代Android/win10

2019独角兽企业重金招聘Python工程师标准>>> 在手机市场领域,Google表现很抢眼,毫无疑问,Android 至今在移动操作系统的市场份额占据绝对领先地位,但是 Android 仍然存在不少问题,碎片化问题严重&#xff0…

美亚Kindle排名第一的Python 3入门书,火遍了整个编程圈

“大多数优秀的程序员从事编程工作,不是因为期望获得报酬或得到公众的称赞,而是因为编程是件有趣的事儿。”——林纳斯托瓦兹(Linus Torvalds)在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本…

seo笔记——搜索显示

一、搜索显示的几个列表形式 1、经典搜索结果列表: 用户搜索时,出现的第一行都是网页的标题(title),颜色醒目的部分是用户搜索的相关内容; 使用百度搜索则第二第三行是网页的说明内容(Des…

【FFmpeg】函数详解(一)

FFmpeg函数详解 一、错误码相关1、AVERROR2、av_strerror3、其他错误码解释二、编解码1、获取编解码器2、申请、释放上下文环境3、打开编码器avcodec_open24、分配一个 AVFrame:av_frame_alloc5、av_frame_get_buffer6、avformat_alloc_output_context27、avformat_new_stream…

第5章 图像分类的数据集

第5章图像分类的数据集 在我们实际进入到代码编写阶段来构建分类器之前,我们首先回顾下在本书中用到的数据集。一些数据集可理想的获得大于95%的准确率,另一些则还在开放研究阶段,还有一些是图像分类竞赛的部分数据集。 现在就对这些数据集进…

一根烟上热搜,先让AI看看你的肺

作者 | 李翔,国内某互联网大厂AI民工,前携程酒店图像技术负责人,计算机视觉和深度学习重度爱好者,在ICCV和CVPR等会议上发表论文十余篇;马杰超,任职于某医学图像创业公司,医学图像AI领域资深从业…

mongodb主从设置,capped collections等常用命令集合

############### Mongodb 主 <> 从切换的时候要删除 ############## ############### use local ############################### ############## db.sources.remove() ############################### # 主#/data/mongodb-linux-x86_64-2.0.2/bin/mongod --por…

调侃吴恩达,Diss特斯拉,吐槽OpenAI…《AI寒冬将至》作者点评2019“AI小丑秀”...

作者 | Piekniewski编译 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;导读&#xff1a;去年&#xff0c;一篇《AI寒冬将至》的文章在AI圈爆红&#xff0c;作者观点鲜明地指出AI领域出现泡沫&#xff0c;并预言AI寒冬将会到来&#xff0c;引起巨大争议。一年…

max_semi_space_size 设置值与实际值不一致的原因分析

问题由来 因为业务的需求&#xff0c;某 Node.js 性能平台用户需要调节新生代大小&#xff0c;Node.js 的启动参数里面的max_semi_space_size可以设置新生代堆空间的大小。 node --v8-options | grep max_semi -A 3 -B 2--min_semi_space_size (min size of a semi-space (in M…

【FFmpeg】函数详解(二)

FFmpeg函数详解 9、av_dump_format10、avio_open11、avformat_write_header12、avcodec_send_frame13、avcodec_receive_packet9、av_dump_format 原型: void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);说明: 打印输入输出格式的详…

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

游戏开发笔记二十七 Direct3D 11入门级知识介绍作者&#xff1a;毛星云 邮箱&#xff1a; happylifemxy163.com 期待着与志同道合的朋友们相互交流上一节里我们介绍了在迈入DirectX 11的学习旅程之后第一个demo创建的全过程。但由于知识衔接的需要&#xff0c;我们的第一…

英特尔蚕食AMD和NVIDIA?

作者 | Daniel Newman译者 | 苏本如&#xff0c;责编 | 郭芮转载自CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【编者按】一个鲜为人知的事实是&#xff0c;英特尔凭借其在集成显卡上的领先地位&#xff0c;持续占据着电脑显卡市场的头把交椅。但是随着过去两年中首席…

使用phpStudy运行伊人集项目

1.首次运行时&#xff0c;需要把system/config/install.look.php以及system/config/database.php&#xff08;后面这个文件可以先不删除&#xff0c;若是安装过程中数据库报错&#xff0c;再来删除它&#xff09;删除2.若只有一个项目版本需要运行的话&#xff0c;可以把项目拷…

【FFmpeg】函数详解(三)

FFmpeg函数详解 14、av_write_frame15、av_interleaved_write_frame16、av_write_trailer17、avio_close18、av_image_get_buffer_size19、av_image_fill_arrays20、av_rescale_q21、视频格式尺寸转换22、音频重采样:23、将像素格式由索引值转换成字符串24、MD5相关25、avio_h…

php时区问题导致php页面显示不正常

cacti安装成功&#xff0c;但报时区错误&#xff0c;已经做了如下操作&#xff0c;后来发现如上设置还是有此问题 将 /usr/local/php5/php.ini文件内修改如下 date.timezone asia/Chongqing 遂解决之。 转载于:https://blog.51cto.com/itnihao/916148

【FFmpeg】降低转码延迟方法、打印信息详解、refcounted_frames详解

文章目录 1、FFmpeg降低转码延迟方法2、ffmpeg打印信息:源码里打印的这段是这样定义的3、解码时 refcounted_frames 标志的使用3.1 启动该标志3.2 解码后,记得释放3.3 详解1、FFmpeg降低转码延迟方法 关闭sync-lookahead降低rc-lookahead,但别小于10,默认是-1降低threads(比…

速度提升270倍!微软和浙大联合推出全新语音合成系统FastSpeech

作者 | 谭旭转载自微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;【编者按】目前&#xff0c;基于神经网络的端到端文本到语音合成技术发展迅速&#xff0c;但仍面临不少问题——合成速度慢、稳定性差、可控性缺乏等。为此&#xff0c;微软亚洲研究院机器学习组和微软&a…