Webpack使用方法与个人心得

1.什么是webpack

webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们可能需要经过编译(比如JSX和sass),但我们无须在上面花费太多心思,因为 webpack 有着各种健全的加载器(loader)在默默处理这些事情。

你可以不打算将其用在你的项目上,但没有理由不去掌握它,因为以近期 Github 上各大主流的(React相关)项目来说,它们仓库上所展示的示例已经是基于 webpack 来开发的,比如 React-Boostrap 和 Redux。

webpack的官网是 http://webpack.github.io/ ,文档地址是 http://webpack.github.io/docs/

2.webpack 的优势

其优势主要可以归类为如下几个:

  1. webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。
  2. 能被模块化的不仅仅是 JS 了。
  3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
  4. 扩展性强,插件机制完善,特别是支持 React 热插拔(见 react-hot-loader )的功能让人眼前一亮。

3.搭建webpack环境

指定版本安装

npm install -g webpack@1.12.3

安装最新版

npm install -g webpack

初始化仓库

npm init -y

下载webpack服务

npm install -g webpack-dev-server

npm install --save-dev webpack-dev-server

4.使用测试

在项目中新建一个文件夹

mkdir test && cd test

目录结构如下

webpack.config.js

  • entry 入口文件 让webpack用哪个文件作为项目的入口
  • output 出口 让webpack把处理完成的文件放在哪里
  • module 模块 要用什么不同的模块来处理各种类型的文件
module.exports = {
    // 入口文件
    entry: {
        "bundle01": "./main01.js",
        "bundle02": "./main02.js"
    },
    output: {
        filename: "[name].js"
    }
}

index.html

    <script src="bundle01.js"></script>
    <script src="bundle02.js"></script>

main01.js

document.write("<h1>Hello webpack</h1>");

main02.js

document.write("<p>hah</p>");

启动服务

webpack-dev-server

浏览器输入localhost:8080

5.安装loader

使用loader,改变页面内容,浏览器会自动刷新

babel-loader

Babel 是一个 JavaScript 编译器,可以将ES6语法转换为ES5语法。

babel的安装

npm install -g babel-cli

npm install --save-dev babel-core babel-loader babel-preset-es2015

目录结构如下

babel的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "babel.js"
    },
    module: {
        loaders: [{
            // 匹配文件格式
            test: /\.js$/,
            // 排除的文件
            exclude: /node_modules/,
            // 需要用到的loader
            loader: "babel-loader"
        }]
    }
}

index.html

    <script src="babel.js"></script>

main.js

import test from "./test.js";
// 等同于
// var test = require("./test.js");

document.write(test.fun1());
document.write(test.fun2());

test.js

function fun1() {
    return "hello es6";
}

function fun2() {
    return "config ok";
}

module.exports = {
    fun1: fun1,
    fun2: fun2
}

json-loader

安装

npm install --save-dev json-loader

目录结构如下

json-loader的使用

webpack.config.js

module.exports = {
    // 入口文件
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.json$/,
            exclude: /node_modules/,
            loader: "json-loader"
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

// require 引入模块(js/json/css/less/sass/img)
var test = require("./test.json");

document.write(test.name);
document.write(test.age);

test.json

{
    "name": "qzy",
    "age": 20
}

css-loader

注意: 安装css-loader必须依赖style-loader模块

css-loader将引入的css生成目标文件

style-loader将生成的目标文件生成标签插入到页面中

安装

npm install --save-dev style-loader css-loader

css-loader的使用

目录结构如下

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loader: "style-loader!css-loader"
        }]
    }
}

//或者

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loaders: ["style-loader","css-loader"]
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

var test = require("./test.css");
document.write("hello css-loader");

test.css

body{
    color: #f00;
}

效果如下

less-loader

注意,安装less-loader必须依赖less,style-loader、css-loader三个模块

安装

npm install --save-dev less-loader less

目录结构如下

less-loader的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.css$/,
            exclude: /node_modules/,
            loaders: ["style-loader", "css-loader", "less-loader"]
        }]
    }
}

index.html

<script src="bundle.js"></script>

main.js

var test = require("./test.less");

document.write("hello less-loader");

test.less

@color : blue;

body{
    color: @color;
    background: #ccc;
}

这样敲代码爽多了,less不用手动编译,只需要保存文件浏览器就自动刷新了,简直是太棒了!

打包静态资源(如:图片)

npm install --save-dev url-loader file-loader image-loader

目录结构如下

url-loader的使用

webpack.config.js

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    module: {
        loaders: [{
            test: /\.(png|jpg|gif)$/,
            exclude: /node_modules/,
            // limit指定文件大小
            loader: "url-loader?limit=8192"
        }]
    }
}

index.html

<body>
    <!-- 防止找不到body -->
    <script src="bundle.js"></script>
</body>

main.js

var img = new Image();
img.src = require("./icon.png");
img.width = 500;
document.body.appendChild(img);

效果

6.使用plugin

代码压缩

npm install --save-dev webpack

webpack.config.js

var webpack = require("webpack");
var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    plugins: [
        new uglifyJsPlugin({
            compress: {
                warnings: false
            }
        })
    ]
}

index.html

<script src="bundle.js"></script>

main.js

document.write("hello world");
/*

占位占位

*/
document.write(a());

function a() {
    var fsdfsdf = "haha";
    return fsdfsdf;
}


var sdfdsfs;

效果:

可以看出代码已经压缩过了

公共模块的提取

CommonsChunkPlugin

作用: 将所有的依赖库打包为一个文件

webpack.config.js

var webpack = require("webpack");
...

module.exports = {
    entry: {
        // 入口文件
        app: "./src/main.js",
        // 依赖的文件
        vendor: [
            "jquery",
            "director" //路由
        ]
    },
    output: {
        path: __dirname + 'dist',
        filename: "bundle.js"
    },
  
    ...
  
    plugins: [
        // 将 entry.vendor 数组中的所有依赖文件打包为vendor.js
        new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')
    ]
}

index.html

<script src="vendor.js"></script>
<script src="bundle.js"></script>

自动打开浏览器

npm install --save-dev open-browser-webpack-plugin

webpack.config.js

var openBrowserPlugin = require("open-browser-webpack-plugin");

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    },
    plugins: [
        new openBrowserPlugin({
            url: "http://localhost:8080"
        })
    ]
}

运行webpack-dev-server会自动打开浏览器

参考资料

一小时包教会 —— webpack 入门指南

Webpack傻瓜式指南

webpack-doc

webpack.github.io

webpack-china

babel官网

阮一峰Babel 入门教程

用webpack的CommonsChunkPlugin提取公共代码的3种方式

npmjs : open-browser-webpack-plugin

Comparison of Build Tools

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

推荐阅读更多精彩内容