解析前端构建工具webpack

前言

真快呀,过年的时候才对webpack 1的了点感性认识,就做了两个关于Vue的项目,之后就出了webpack 2,怕来不及记录,所以写这篇文章来记录一下Webpack 2。

Webpack概述

webpack is a module bundler for modern JavaScript applications.

上述是来自官方文档的定义,说白了就是webpack = module bundler(加载器),对于webpack来说,所有的文件都是模块,只是处理的方式不一样罢了。

说道学习webpack的难易程度:

It is incredibly configurable, but to get started you only need to understand Four Core Concepts: entry, output, loaders, and plugins.
官网说:「很容易的,只要理解了entry、output、loaders、plugins这四个核心概念,你就入门了!」

所以要好好学英语呀,当然还有一些cli/nodeJS的知识。

webpack配置文件

要想使用webpack,其根目录下会有一个webpack.config.js的文件,大概是这样:

// webpack.config.js
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配置文件,基本可以处理大多数的前端业务场景了。

解读webpack配置文件

讲解内容还是以一个Github项目为主:地址

四个核心概念

1. entry

entry就是整个模块的读取入口,根据webpack 2的文档,对entry值有了更多的拓展

    let base ='./index.js'
    
    //let base = {
    //    index:'./index.js',
    //    index1:'./index1.js'
    //};

    // webpack2 提供了多种配置方案   https://webpack.js.org/configuration/entry-context/#entry
    // const dynamic_entry = ()=>base;

    // const dynamic_entry_promise=()=>{
    //  return new Promise((resolve,reject)=>{
    //      resolve(base)
    //  })
    // }


    module.exports = {
        entry:base,
        output: {
            filename: '_[name].js' 
        }
    };

2. output

output这个对象的设置告诉webpack怎样的放置导出的文件。

    //文档  https://webpack.js.org/configuration/output/
    const path =require('path');
    let base = {
        index:'./index.js',
        index1:'./index1.js'
    };

    module.exports = {
        entry:base,
        output: {
            // 设置导出模块 使用绝对路径 
            path: path.resolve(__dirname, 'dist'),
            // 使用 on-demand-loading 或者加载其余的资源如:图片、文件等
            //  起了服务器,设置关于导出文件目录 公共的路径(URL) 
            publicPath: "/output/dist/",
            // 设置包规范格式(写一些模块给别人用,设置过后会根据所给类型打包源码 也有amd cmd的规范)
            libraryTarget:'umd',
            // 给自己的库起的名字,跟amd规范里difine的中的第一个参数一样
            library: "MyLibrary", 
            // 除entry以外的那些需要加载的文件命名
            // chunkhash => webpack对每一个文件编译产生的hash
            chunkFilename:'[chunkhash]_[name].js',
            // hash值的设置
            hashDigestLength:3,
            // 导出文件名
            // hash ==> webpack编译过程产生的hash值
            filename: '[hash]_[name].js'
        }
    };

3. modules/loaders

对每一个不同文件的处理方式的设定

//webpack 1的写法
    module: {
        loaders: [{
            test: /\.js[x]?$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
        }]
    }
    // webpack 2的写法
    module:{
        rules:[
                {
                // 是Rule.resource.test的简写 
                // 作用就是检测condition是否匹配这个resource query 
                // 是就使用loader编译,反之不用,仅仅是预处理
                test: /\.jsx?$/,
                // rule.use是数组形式和rule.loaders是它的别名
                use:[{
                    loader: "babel-loader",
                }]
            },
        ]
    }

4. plugins

plugin是Webpack构建过程中的个性化的处理设置。其中有一些自带的插件。参考文档

    plugins: [
        // 自带的压缩代码的插件
       new webpack.optimize.UglifyJsPlugin({
           compress: {
               warnings: false
           }
       })
    ]

这一部分,不知如何讲好,找了一些文档来辅助,辅助文档

以上是核心的四个概念和部分常用配置参数的讲解。

5. resolve

These options change how modules are resolved.
resolve.alias的作用就是对module模块提供别名,和require里的path参数有相似的作用。(可以将一些需要多次引用的模块改成一些东西)

resolve:{
    alias:{
        jquery :path.resolve(__dirname,'/src/lib/jquery.js')
    }
  }

6. devtool

这个是大招了,可以让我们在浏览器的调试工具调试的是否是源码。
如果想要显示源码,就用devtool:source-map

module.exports = {
  // https://webpack.js.org/configuration/devtool/#devtool
  devtool:'source-map',
  // https://webpack.js.org/configuration/target/#target
  target:"web",
  entry:"./index.js",
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  },
};

文章只是对webpack一些参数进行了讲解

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

推荐阅读更多精彩内容

  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,655评论 7 110
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,019评论 0 21
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,125评论 7 35
  • 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过...
    阳阳阳一堆阳阅读 3,252评论 0 5
  • 本人,性别女,大三党一枚,就读于浙江某所普通二本院校,环境设计专业,作图狗一只,属于经常和电脑死k族,患有严重的拖...
    查理冰块阅读 261评论 0 2