前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Webpack的精彩世界

Webpack的精彩世界

作者头像
疯狂的技术宅
发布2019-03-27 16:03:57
5020
发布2019-03-27 16:03:57
举报
文章被收录于专栏:京程一灯京程一灯

Webpack是一个JavaScript模块打包工具,如官网宣传的那样。它有一个贴切的名字。但在本文中,我想完成的是详述Webpack真正强大的地方。

本文不会介绍如何使用Webpack,而是解析使它比一般打包工具变得更为特殊的原因。

##Webpack仍是一种打包工具

像Webpack此类工具产生的最主要原因之一,便是解决依赖问题。该依赖问题是JavaScript(尤其是Node.js中的模块所导致的。

Node.js允许你使用模块化代码。代码的模块化导致了依赖问题。循环依赖(Cyclic dependencies)可能会产生,例如, A->B->A的引用关系。像Webpack这样的工具,可以构建模块引用的完整依赖图。通过这个图,分析器可以帮助减轻依赖图的压力。

Webpack在代码中置入多个入口,并有一个输出,该输出已完成将依赖图与一个或多个文件进行捆绑。

Webpack可以做得更多

对于我来说,Webpack如此特殊,缘于它提供的优秀的扩展。

Loaders

Loader是我喜欢提及的mini-transpiler。它适用于任何类型的文件,如TypeScript、CoffeeScript、JSON等,之后产生的JavaScript代码添加至Webpack正构建的依赖图中。

Loader的魅力在于,它们是源源不断的。Loader是一个扩展,你可以创建自己的Loader,目前已有100个默认和大量第三方的Loader。

例如,如果想把静态类型语言,如C#,编译成Webpack可以理解的JavaScript,有没有这样一个Loader?

Loader具有无限可能,具有可组装、可配置、基于文件类型进行过滤等特点。

一个普通的例子

正如Webpack文档中解释的那样,一个Loader只是一个可以输出funtion的Node.js模块。一个Loader与输出function的Node.js模块同样简单:

代码语言:javascript
复制
 module.exports = function(src) {
        return src + '\n'
            + 'window.onload = function() { \n'
            + ' console.log("This is from the loader!"); \n'
            + '}';
    };

这是解释Loader是什么的一个小例子。这个Loader正在添加一个function,该function的功能是在当前的浏览器会话中,当Window加载时,在控制台上进行输出。

记住这一点,我们就不难理解:无论源是任何类型的语言,都可以按我们的想法进行解释。重新回答我们刚才的例子中,我们可以把C#作为输入,创建一个解析器,将它转换为Webpack可以接受的自然JavaScript。

将C#转换成JavaScript的编译器,虽有点牵强附会,说实在的有些无意义,但我希望你可以领导会我们是如何利用Loader,让Webpack不再仅仅是一个bundler。

Plugins

相比于Loader,插件让Webpack可进行的定制化服务更加广泛。在插件中,你可以在Webpack中增加额外的功能。例如,你可以添加实现缩小功能的插件,从输出(如CSS)中提取某些文本,利用插件进行压缩等。

插件通过自行访问Webpack编译器完成工作。它们能访问可能产生的所有编译步骤,并可以修改所有的步骤。这意味着一个插件可以修改文件已经生成的内容,可以修改文件引入的内容等。

下面是插件的一个小例子:

代码语言:javascript
复制
 file: './my-custom-plugin.js'

function MyCustomPlugin() {}

MyCustomPlugin.prototype.apply = function(compiler) {
    compiler.plugin('emit', displayCurrentDate);
    compiler.plugin('after-emit', displayCurrentDate)
}

function displayCurrentDate(compilation, callback) {
    console.log(Date());

    callback();
}

module.exports = MyCustomPlugin;

该例子中,我们在Webpack编译器中,为两个event hook分别添加了事件处理器。其结果是在asset被输出到结果目录之前,在控制台打印一个日期,在asset已被输出后再打印一个日期。

该插件也可以应用到Webpack的配置中:

代码语言:javascript
复制
 var MyCustomPlugin = require('my-custom-plugin');

var webpackConfig = {
    ...
    plugins: [
        new MyCustomPlugin()
    ]
}

现在这个插件可以在编译过程中的emit和after-emit两个阶段运行。Webpack网站上有一个很好的 compiler event hook列表可以使用。

重申一遍,插件的重要性在于它们是扩展。Webpack允许用户完全扩展它的内核。已有很多插件可供选择,很多来自第三方。

请记住这一点,插件可以获取你请求的Asset,并通过一定的算法对他们进行压缩。事实上,现在已经有插件可以完成这件事了。

总结

Webpack是一个模块打包工具。它可以产生依赖图,输出浏览器可读的格式。

然而,Webpack还可以做得更多。

假设我们可以将C#代码编译成JavaScript会怎样呢?假设我们获得一个图片,想自动完成裁剪与使用灰度来表示会怎样呢?

我想如果你把Webpack看成一个编译器,而不仅仅是一个打包工具,那你将看到它真正的强大之处。


往期精选文章

ES6中一些超级好用的内置方法

浅谈web自适应

使用Three.js制作酷炫无比的无穷隧道特效

一个治愈JavaScript疲劳的学习计划

全栈工程师技能大全

WEB前端性能优化常见方法

一小时内搭建一个全栈Web应用框架

干货:CSS 专业技巧

四步实现React页面过渡动画效果

让你分分钟理解 JavaScript 闭包



小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。

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

本文分享自 京程一灯 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Webpack可以做得更多
    • Loaders
      • 一个普通的例子
    • Plugins
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档