webpack技术讲解及入门

本文为饥人谷讲师slashhuang原创文章,首发于 前端学习指南

webpack技术入门

webpack基本已经成为前端项目的标配构建工具了。

然而,在一个前端团队里面,除了架构师之外,其他开发者很难有机会在工作中完整的实现整个配置流程。

本篇文章是我在公司里面分享webpack及babel配置和插件开发的一个细节版本,

希望能让大家通过阅读本文,比较好的梳理webpack工具。

webpack的出现解决了什么问题

JavaScript自面世之后,就成为浏览器的标准脚本语言。

然而JS本身并没有提供python和java的package包、子模块的import等语法。

同时,前端代码还需要处理类似CSS、png、webfonts等非JS的文件。

在前端工程化大潮下,一个既能处理JS又能处理别的资源文件的加载器(bundler)亟待出现。

webpack就是这类解决方案中的杰出代表。

下面,我将按照如下的目录结构对webpack使用进行讲解。

1、webpack概述
2、一个简单而通用的webpack配置文件
3、webpack的配置文件解读
4、webpack常用的plugins及loader

1.webpack概述

webpack = module building system。

在webpack看来,所有的资源文件都是模块(module),只是处理的方式不同。

上面两句话就把webpack从top-level的角度讲清楚了。

关于webpack的使用,其实和我们平时开发业务产品是一个道理。

产品需求 ===> 代码设计 ===> 提供API给开发者使用。

webpack解决的需求点就是如何更好的加载前端模块

这里我用了模块二字,是因为webpack从JS出发,将所有的文件看做它要处理的模块。

webpack本身并不关心这个模块是什么,它只是调度配置文件中对模块处理的方式来完成这一切,而不必纠结文件类型。

比如我们会在项目中使用ES6/7的语法来编写JS代码,

于是我们只需要配置babel-loader即可处理这种JS。

比如我们需要加载html文件获取html字符串,

于是我们只需要配置raw-loader即可拿到对应文件的字符串。

比如我们需要将sass/less文件预编译成css,

于是我们只需要配置sass-loader/less-loader即可处理。

webpack提供了一套API接口,开发者只需要按照它提供的规范照着做就行了。

对于开发者来说,除了需要阅读英语文档能力和nodeJS之外,webpack的学习门槛真的不高。

2.一个简单而通用的webpack配置文件

我们以如下的 webpack.config文件来进行分析
var webpack = require("webpack");
var DefinePlugin = require('webpack/lib/DefinePlugin');
module.exports =  { 
        context:process.cwd(),watch: true,entry: './index.js',devtool: 'source-map',output: {
            path: path.resolve(process.cwd(),'dist/'),filename: '[name].js'
        },resolve: {
            alias:{ jquery: process.cwd()+'/src/lib/jquery.js',}
        },plugins: [
            new webpack.ProvidePlugin({
                $: 'jquery',_: 'underscore',React: 'react'
            }),new DefinePlugin({
              'process.env': {
                'NODE_ENV': JSON.stringify('development')
              }
            })
        ],module: {
            loaders: [{
                test: /\.js[x]?$/,exclude: /node_modules/,loader: 'babel-loader'
            },{
                test: /\.less$/,loaders:['style-loader','css-loader','less-loader']
            },{
                test: /\.(png|jpg|gif|woff|woff2|ttf|eot|svg|swf)$/,loader: "file-loader?name=[name]_[sha512:hash:base64:7].[ext]"
            },{
                test: /\.html/,loader: "html-loader?" + JSON.stringify({minimize: false })
            } ]
        }
    };

这个简单的webpack配置文件,基本可以处理大多数的前端业务场景了。

通过配置plugins、module.loaders、entry、output基本可以构建一个兼容本地开发和生产环境的富应用web工程,下面针对以上的配置文件进行分析。

3. webpack的配置文件解读

* module.loaders数组
    [{
        test: /\.js[x]?$/,loader: 'babel-loader'
    }]
比如有个文件require('index.jsx'),webpack会根据文件名是否满足test字段的正则来决定是否使用babel-loader来处理文件。 exclude则是告诉webpack不需要对node_modules目录进行处理
  • resolve对象
resolve: {
            alias:{ jquery: path.resolve(process.cwd(),'src/lib/jquery.js')},extensions:['.js','.json']
        }
resolve对象是在 webpack预编译时,就加载进整个webpack编译的配置中的。

比如alias会建立文件标识符映射表

require('jquery')==> require('/Users/**/src/lib/jquery.js')

  • plugins数组
/**
    比如有个文件代码中存在process.env对象,则process.env将会被替换成上面的{
        'NODE_ENV': JSON.stringify('development')
    }    console.log(process.env)==>console.log(({"NODE_ENV":'development'}))
    */

    plugins: [new DefinePlugin({
        'process.env': {
            'NODE_ENV': JSON.stringify('development')
            }
        })]
关于这个配置文件,读者如果有疑问,可以直接在评论区留言,我会尽快回复,这里就不赘述了。

更进一步的webpack配置含义可以参考我的github博客webpack编译流程漫谈

4. webpack常用的loaders和plugins

关于loader这块呢,webpack官方给出了非常详尽的解决方案,基本不用开发者再去开源社区上寻找。 前端资源loaders列表

关于plugins这块,除了webpack官方推荐的几款plugins外,社区上也有非常多不错的插件。webpack内置的plugins列表

经过多个前端项目搭建实践下,笔者认为如下几款plugins是非常不错的。

1、代码优化之:

  • CommonsChunkPlugin - 抽取公共代码
  • UglifyJsPlugin - 压缩混淆代码

2、 依赖注入之:

  • DefinePlugin - 自由变量注入
  • ProvidePlugin - 模块变量标示符注入

3、 文件抽取之:

  • file-loader - 传送font等文件
  • ExtractTextPlugin - 抽取css文件

4、 开发体验优化之:

  • WebpackNotifierPlugin - 编译完成动态通知
  • HtmlWebpackPlugin - 采用模板引擎形式注入到html文件,让开发更加easy

5、 目录/文件拷贝之:

  • CopyWebpackPlugin - 目录及文件拷贝

5.webpack总结

本篇文章对webpack的讲解主要集中在API层面。

另外,关于更加深入的webpack的编译流程, 我几个月前写过一篇博客webpack编译流程漫谈,可以供大家参考学习。

最后 欢迎大家关注我的知乎前端学习专栏

加微信号: astak10或者长按识别下方二维码进入前端技术交流群 ,暗号:写代码啦

每日一题,每周资源推荐,精彩博客推荐,工作、笔试、面试经验交流解答,免费直播课,群友轻分享... ,数不尽的福利免费送

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom