资讯专栏INFORMATION COLUMN

从零开始的webpack生活-0x009:FilesLoader装载文件

NervosNetwork / 950人阅读

摘要:修改配置文件匹配的文件名,这里匹配后缀为的,只要了该文件名结尾的文件,都将使用这个来处理命中后使用的加载器查看结果,和之前一致,推荐使用配置文件形式,可以保持引入文件格式的一致性。有利于维护和美观更多配置,可以查阅关于部分。

0x001 概述

上一章讲的是DLL加速编译,这一章开始讲loader相关的部分,但是关于plugin的部分善未完结,因为即将要讲的ExtractTextWebpackPlugin用到了一些loader,所以觉得先讲一下loder比较好。

0x002 loader介绍

我比较喜欢装载器这个翻译,loder说白了就是对各种文件的转化而已,比如json-loader可以将loader文件中的内容转化为js对象,也就是可以模拟为读取json文件然后做JSAON.parse而已,而对于其他的装载器则也类似,是对不同文件的不同处理方式,只是他们保持了相同的接口形式。就像一个加工的机器,有一个入口和一个出口,入口放猪肉,出来猪肉制品,入口放鸡肉,出来鸡肉制品,里面如何实现或许不一样,但是操作方式基本一致。

0x003 栗子1-raw-loader:读取文件,并封装成模块,导出唯一的内容为文件内容的字符串

初始化项目

$ mkdir 0x009-loader
$ cd 0x009-loader
$ npm init -y
$ cnpm install --save-dev webpack raw-loader

添加配置

const path              = require("path");

module.exports = {
    entry  : {
        "index": ["./src/index.js"],
    },
    output : {
        path    : path.join(__dirname, "dist"),
        filename: "[name].bundle.js"
    }
};

添加示例文件

// ./srcindex.txt
hello loader

// ./src/index.j
var content = require("raw-loader!./index.txt")
console.log(content)

打包并查看结果

$ webpack
// ./dist/index.js
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

var content = __webpack_require__(2)

console.log(content)


/***/ }),
/* 2 */
/***/ (function(module, exports) {

module.exports = "hello loader"

/***/ })
/******/ ]);

可以看到,文件的内容被以一个模块的形式导出,而在引入的文件中,变得不再是引入一个文件,而是一个模块。

不在require中使用loader,因为麻烦且不美观,我们可以把它迁移到webpack.conf.js中。

修改配置文件

// ./wenpack.conf.js
const path = require("path");

module.exports = {
    entry : {
        "index": ["./src/index.js"],
    },
    output: {
        path    : path.join(__dirname, "dist"),
        filename: "[name].bundle.js"
    },
    module: {
        rules: [
            {
                test: /.txt$/,
                use : "raw-loader"
            }
        ]
    }
};

test:匹配的文件名,这里匹配后缀为.txt的,只要require了该文件名结尾的文件,都将使用这个raw-loader来处理

use:命中后使用的加载器

查看结果,和之前一致,推荐使用wenpack配置文件形式,可以保持引入文件格式的一致性。有利于维护和美观

更多配置,可以查阅webpack关于raw-loader部分。

0x004 栗子2-json-loader:将json文件转化成js对象

安装依赖

$ cnpm install --save-dev json-loader

添加rule配置

{
    test: /.json$/,
    use : loader : "json-loader"
}

引用

//./src/index.json
{
  "name": "张三",
  "age": "21"
}
// ./src/index.js
require("./index.json")

打包并查看结果

/* 1 */
/***/ (function(module, exports, __webpack_require__) {

__webpack_require__(2)

/***/ }),
/* 2 */
/***/ (function(module, exports) {

module.exports = {"name":"张三","age":"21"}

/***/ })
/******/ ]);

可见,json-loder将文件内的json字符串转化成了js对象,相当于使用raw-loader获取文件内容字符串,再调用JSON.parse,然后封装成模块并导出。

0x005 栗子3-file-loader:导出文件并返回文件的URL

安装依赖包

$ cnpm install --save-dev file-loader

添加rule配置

{
            test: /.(png|jpg|gif)$/,
            use : [
                {
                    loader : "file-loader",
                    options: {}
                }
            ]
        }

引用

// ./src/index.js
var funny = require("./../res/funny.png")

打包并查看结果

$ ls ./dist
4e4e36593ce458606ffd851043749eec.png
index.bundle.js
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

// var content = require("raw-loader!./index.txt")
// var content = require("./index.txt")

var funny = __webpack_require__(2)


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__.p + "4e4e36593ce458606ffd851043749eec.png";

/***/ })
/******/ ]);

可以看出,文件被导出到了dist,并且将文件的路径封装成了模块并导出。

option其他配置

name:名字

[path]:文件路径

[name]:文件名称

[hash]:文件hash

[ext]:文件后缀

以上变量可以随机组合,形成文件名,推荐:[name].[hash].[ext]

注意:每引入一个文件,就会生成一个模块,即便该文件只是文件名不同,但是内容相同

更多配置,可以查阅webpack关于file-loader部分。

0x006 栗子4-url-loader:根据文件大小类型判断是否DATAURL

删除file-loader,添加配置

{

            test: /.(png|jpg|gif)$/,
            use : [
                {
                    loader : "url-loader",
                    options: {
                        limit   : 1048576, // 低于1m, 这里的单位是Byte
                        mimetype: "image/jpg", // 类型是`jpg`
                        name    : "[name].[hash].[ext]",
                        fallback: "file-loader" //否则使用`file-loader`
                    }
                }
            ]
        }
```

引入一张高于1048576的jpg图片和1张低于81920的jpg图片,还有一张png图片,da

// 低于1048576
require("./../res/icon.jpg")
// 高于1048576
require("./../res/big.jpg")

打包并查看结果

// ./dist
big.f22f26599897a8f5003aea3d070135bf.jpg
index.bundle.js
// ./index.bundle.js

/***/ }),
/* 2 */
/***/ (function(module, exports) {

module.exports = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAcFBQYFBAcGBgYIBwcICx...
tDEx6snNS15Z9DcRe9a1n/AMew+tZI/qK1rP8A49h9a1p7Es//2Q=="

/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__.p + "big.f22f26599897a8f5003aea3d070135bf.jpg";

/***/ })
/******/ ]);

可以看出大于1m的那个图片文件被以文件的形式导出,而小于1m的文件被以dataurl的形式封装成模块

参数说明

limit:限制文件大小,如果小于这个数,则转化成DATAURL,如果大于这个数,则使用fallback指定的loader再次装载,如果没有配置fallback,则默认调用file-loader

mimetype:这个只是用来指定文件的mimetype,因为有些文件没有后缀,或者后缀和文件不符合。

fallback:文件超出limit之后的加载器

注意url-loader自身只有这3个参数,但是如果超出limit大小,将会执行下一个loader并且自动将配置的参数往下传,所以文中的案例的name其实是file-loader的参数,其他loader的参数同理也可以往下传

注意:这里的use其实还有另外一种querystring写法,不过不推荐

{
        test: /.(png|jpg|gif)$/,
        use:"url-loader?limit=1045876&name=[name].[hash].[ext]"
    }

更多配置,可以查阅webpack关于url-loader部分。

0x007. 资源

源代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89623.html

相关文章

  • 从零开始webpack生活-0x001:webpack初次相逢

    摘要:同时不能直接单纯的指定输出的文件名称,比如,将会报错,可以换成以下方式指定,或者其他类似方式。如果打包过程出现错误,比如语法错误,将会在控制台以红色文字显示,并且在你修复之后会再次打包。 0x001 概述 其实我不知道怎么写,所以决定就一块一块的写点平常配置的过程,根据不同东西稍微分区一下就好了 0x002 初始化项目结构 $ mkdir webpack_study $ cd webp...

    Turbo 评论0 收藏0
  • 从零开始webpack生活-0x011:StylingLoader装载样式

    0x001 概述 上一章讲的是装载模板,这一章讲的是装载样式 0x002 配置环境 $ mkdir 0x011-styling-loader $ cd 0x011-styling-loader $ npm init -y $ npm install --save-dev webpack $ touch ./src/index.js $ vim webpack.config.js // ./web...

    mylxsw 评论0 收藏0
  • 从零开始webpack生活-0x012:TranspilingLoader装载脚本

    摘要:概述上一章讲的是样式装载相关的,这一章见得是脚本加载相关的环境配置栗子加载安装依赖修改配置添加配置文件使用编写脚本打包并查看结果可以看到,语法被自动转化成了更多配置请查阅关于章节栗子加载安装依赖 0x001 概述 上一章讲的是样式装载相关的loader,这一章见得是脚本加载相关的loader 0x002 环境配置 $ mkdir 0x012-transliling-loader $ c...

    Tonny 评论0 收藏0
  • 从零开始webpack生活-0x010:TemplatingLoader装载模板

    摘要:概述上一章讲的时候关于文件相关的,这一章讲的是模板相关的。环境配置栗子加载安装依赖包编写并引入配置低于否则使用打包并查看结果可以看到,被打包成了字符串,并封装成模块导出。更多资源,请查阅的仓库和官网资源源代码 0x001 概述 上一章讲的时候关于文件相关的loder,这一章讲的是模板相关的loder。 0x002 环境配置 $ mkdir 0x010-templating-loader...

    jk_v1 评论0 收藏0
  • 从零开始webpack生活-0x013:LintingLoader格式校验

    摘要:概述上一章讲的是脚本装载相关的,这一章见得是脚本格式校验相关的环境配置使用校验格式这份配置是偷的安装依赖包修改配置文件添加配置文件编写测试代码张三打包输出张三 0x001 概述 上一章讲的是脚本装载相关的loader,这一章见得是脚本格式校验相关的loader 0x002 环境配置 $ mkdir 0x013-linting-loader $ cd 0x013-linting-load...

    ephererid 评论0 收藏0

发表评论

0条评论

NervosNetwork

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<