webpack技术讲解及入门

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]?$/,
        exclude: /node_modules/,
        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层面。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容