[译]开启webpack之旅( 三 ):使用Loaders

热榜客
• 阅读 2707

原文地址

Loaders为何物?

Loaders是应用于你app资源文件上的转换器。它们是执行在node端的函数,它们将源文件作为参数并将转换结果作为新的资源返回。
例如,你可以使用loaders让web pack加载CoffeeScript或是JSX。

Loader特性

  • Loaders可以被链式调用。它们像管道(pipeline)一样处理资源。只有最后一个loader返回JavaScript格式的代码,而其他的loader可以返回任意格式并将其传给下一个loader

  • Loaders既能同步执行也能异步执行

  • Loaders运行在 node.js 环境中,所以可以做任何可能的事情

  • Loaders接受query参数,这意味着我们可以把配置项传给loader

  • Loaders在配置文件中可以被绑定到不同的文件,通过扩展名或正则表达式

  • Loaders可通过nam发布或安装

  • 除了可以在package.son文件中配置loader,通常模块也作为可以loader。

  • Loader 可以访问配置

  • 插件赋予loaders更多特性

  • Loaders可用来分发文件(详见

  • 其他特性
    如果对某些loader感兴趣,请翻阅loaders列表

Loaders的解析

Loaders的解析与模块的解析一致,每个loader都是运行在JavaScript中的脚本并通常返回一个函数。我们通常用nam管理loaders模块,但在你的app也可以使用自己写的文件充当模块。

模块的引用

并非硬性要求,只是我们习惯上使用XXX-loader作为loaders的名称。其中XXX是上下文名称,例如json-loader

你可以通过全名引用一个loader(如json-loader), 也可以使用简写(如json)。
loader名称的习惯用法与优先级规则由webpack的配置API: resolveLoader.moduleTemplates 定义。

Loader名称的习惯用法是很有用的,特别是在使用require()语句引用Loader时。参见下述用法。

安装loaders

发布在npm上的loaders你可以使用:

$ npm install xxx-loader --save

$ npm install xxx-loader --save-dev

安装。

用法

在app中使用loaders的方法也是多种多样的:

  • 直接使用require语句引用

  • 在配置文件中配置configuration

  • 在CLI(命令行)中配置

通过require引用loaders

注意:在任何情况下都因避免使用此方法,如果你想要让你的脚本不依赖运行环境(node或浏览器)。使用配置去声明loaders(参见下述配置)。

请尽量使用require语法声明(或define,require.ensure).使用!作为loaders与资源之间的分隔。被引用部分的相对路径是当前目录。

模块可以串联,通过使用!符号组织。

require("./loader!./dir/file.txt");
// => 使用在当前目录下的"loader.js"文件去处理在文件夹"dir"中"file.txt"文件

require("jade!./template.jade");
// => 使用"jade-loader" (通过nam安装在"node_modules")去处理文件"template.jade",如果配置中对文件还有别的处理也会被应用。

require("!style!css!less!bootstrap/less/bootstrap.less");
// => "bootstrap"目录下的"less"目录下的"bootstrap.less"文件将会被"less-loader"处理后转给"css-loader"处理之后再转给"style-loader"处理,如果配置中对文件还有别的处理将不会被应用。

配置文件

在配置文件中通过正则绑定loaders:

{
    module: {
        loaders: [
            { test: /\.jade$/, loader: "jade" },
            // => "jade" loader处理".jade"文件

            { test: /\.css$/, loader: "style!css" },
            // => "style"与"css" loader 处理 ".css" 文件
            // 另一种语法:
            { test: /\.css$/, loaders: ["style", "css"] },
        ]
    }
}

CLI

通过命令行扩展绑定loaders:

$ webpack --module-bind jade --module-bind 'css=style!css'

这里使用“jade” loader 来处理“.jade”文件,使用“style” loader与“css” loader 处理“.css”文件。

查询参数

Loader可以通过查询字符串来传递查询参数(像url中一样)。通过使用?将查询字符串附加在loader后,如url-loader?mimetype=image/png。

注意:查询字符串的格式取决于具体loader。详见具体loader文档.大多数loader接受参数格式(?key=value&key2=value2)也接受JSON对象(?{"key":"value","key2":"value2"})。

在require中使用的例子

require("url-loader?mimetype=image/png!./file.png");

在Configuration中使用的例子

{ test: /\.png$/, loader: "url-loader?mimetype=image/png" }
or

{
    test: /\.png$/,
    loader: "url-loader",
    query: { mimetype: "image/png" }
}

CLI

webpack --module-bind "png=url-loader?mimetype=image/png"
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
可莉 可莉
4年前
18个常用 webpack插件,总会有适合你的!
!(https://oscimg.oschina.net/oscnet/71317da0c57a8e8cf5011c00e302a914609.jpg)来源| https://github.com/Michaellzg/myarticle/blob/master/webpack/Plugin何为插
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这