关于

前言

这是我第一篇介绍webpack的文章,先从一个入门教程开始吧,后续会有更多相关webpack的文章推出。

首先什么是webpack?如果说它是一个打包工具那真的是有点大材小用了。我个人认为webpack是一个集前端自动化、模块化、组件化于一体的可拓展系统,你可以根据自己的需要来进行一系列的配置和安装,最终实现你需要的功能并进行打包输出。

本文作为一篇入门教程,这里先从webpack最简单的3招开始介绍,即拆分、打包、压缩。

步骤

1.传统项目中的问题

在不依赖任何自动化、模块化工具的项目中,通常我们的代码是这样的:

index.html

<html>
<head>
<title>传统项目</title>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
</head>
<body>
<script src="app/index.js"></script>
</body>
</html>

app/index.js

function main() {
$('body').html('hello world!');
} main();

以上示例中,脚本之间存在着隐式依赖关系。

index.js取决于被包括在页面运行之前的jQuery,它只是假设有一个全局变量$的存在。

这样管理JavaScript项目有一些问题:

如果依赖项丢失,或者包含在错误的顺序中,应用程序将不会运行。
如果包含依赖项但没有使用,那么浏览器必须下载很多不必要的代码。

所以为了解决以上问题,我们需要使用webpack来实现一些改变。

2.准备

首先我们得在项目中安装webpack,我们打开命令行工具运行:

mkdir demo && cd demo // 新建demo文件夹并打开
npm init // 初始化npm,生成package.json配置文件
npm install --save-dev webpack@beta // 安装webpack2.0版本,mac系统可能需要添加sudo命令

以上使用的npm命令需要安装node.js,可以点击这里安装即可:node.js

为了改进上方传统项目中的不足,我们这里还需要安装jQuery:

npm install --save jQuery // 安装jQuery

3.改变

改变后的index.js

var $ = require('jquery');

function main() {
$('body').html('hello world!');
} main();

这里我们可以直接在index.js里引用jQuery,index.js明确要求jQuery的存在,这样就不存在隐式依赖的问题(没有全局污染)。

改变后的index.html

<html>
<head>
<title>webpack项目</title>
</head>
<body>
<script src="dist/bundle.js"></script>
</body>
</html>

这里我们的index.html文件只引入了最终打包后的bundle.js。现在运行webpack命令将index.js输出为bundle.js。

运行命令:webpack app/index.js dist/bundle.js

webpack app/index.js dist/bundle.js
Hash: 3bb91a6dedfc2a2a1c08
Version: webpack 2.2.0-rc.4
Time: 397ms
Asset Size Chunks Chunk Names
bundle.js 270 kB 0 [emitted] [big] main
[0] ./~/jquery/dist/jquery.js 267 kB {0} [built]
[1] ./app/index.js 83 bytes {0} [built]

最终我们在浏览器中打开index.html页面可以看到输出的“hello world!”。

4.拆分

现在如果我们index.js中的”hello world!”字符串需要放到另外一个hello.js中,然后在index.js中引入使用的话,这就涉及到webpack模块拆分的功能。

app/index.js

var $ = require('jquery');
var str = require('./hello.js'); function main() {
$('body').html(str);
} main();

app/hello.js

var str = 'hello world!';

module.exports = str;

我们在hello.js中通过module.exports导出str变量,然后在index.js通过require导入同样可以实现浏览器中输入“hello world!”的效果,当然我们需要重新运行下webpack命令:webpack app/index.js dist/bundle.js

5.打包

其实在上面我们已经使用了打包命令:

webpack app/index.js dist/bundle.js

其中的app/index.js即为打包的入口文件,而dist/bundle.js为输出文件。

但是我们会发现这样的命令不利于我们复杂项目配置的使用,对于更复杂的配置,我们可以利用配置文件webpack.config.js来统一管理。

我们可以在demo文件夹下新建webpack.config.js配置文件:

var path = require('path');

module.exports = {
entry: './app/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
}

上方配置中的entry就是我们的入口文件,可以有多个入口文件,而output即为webpack打包的输入对象,filename为输出文件名,path为输出路径。

如此我们运行命令行:

webpack --config webpack.config.js

同样可以生成打包目录dist及打包文件bundle.js。

当然你也可以直接运行简化的命令:

webpack

webapck会自动去寻找当前目录下的webpack.config.js文件。

6.压缩

上一步我们利用webpack命令将多个多件打包到了一个bundle.js的文件中,但是并未进行压缩,你可以打开bundle.js进行查看。

而如果我们需要对打包后的代码进一步压缩处理,我们可以运行命令:

webpack -p

这时我们可以来进行下打包和压缩的文件大小对比

打包命令:webpack

webpack
Hash: ab4a1091f0880100eab0
Version: webpack 2.2.0-rc.4
Time: 387ms
Asset Size Chunks Chunk Names
bundle.js 270 kB 0 [emitted] [big] main
[0] ./app/hello.js 50 bytes {0} [built]
[1] ./~/jquery/dist/jquery.js 267 kB {0} [built]
[2] ./app/index.js 114 bytes {0} [built]

输出的bundle.js整个文件大小为270 kB。

压缩命令:webpack -p

webpack -p
Hash: ab4a1091f0880100eab0
Version: webpack 2.2.0-rc.4
Time: 1967ms
Asset Size Chunks Chunk Names
bundle.js 88.3 kB 0 [emitted] main
[0] ./app/hello.js 50 bytes {0} [built]
[1] ./~/jquery/dist/jquery.js 267 kB {0} [built]
[2] ./app/index.js 114 bytes {0} [built]

输出的bundle.js整个文件大小为88.3 kB。

很明显,文件被压缩了。

7.进一步压缩优化

上方我们通过webpack的压缩命令将文件打包并压缩了,但是对于webpack -p压缩后的文件来说其实还有压缩的余地。如果你使用的是webpack1.0,那么你可以在配置文件中添加plugins配置项,并且加入如下插件:

var webpack = require('webpack');

module.exports = {
...
plugins:[
// 去除代码块内的告警语句
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
// 优先考虑使用最多的模块,并为它们分配最小的ID
new webpack.optimize.OccurenceOrderPlugin()
]
...
}

而本示例中使用的是webpack2.0版本,在2.0中UglifyJsPlugin的compress选项默认为false,并且OccurrenceOrderPlugin默认启用,所以无需进行配置。

结语

本文主要介绍了webpack入门的一些简单命令和基本配置信息,从代码拆分、打包、压缩的角度和传统的前端项目进行对比,希望以此加深大家对webpack基础知识的印象。

​

webpack入门必知必会的更多相关文章

  1. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  2. .NET零基础入门09:SQL必知必会

    一:前言 仿佛到了更进一步的时候了,每一个程序员迟早都会遇到数据存储的问题.我们拿什么来存储程序产生的数据?举例来说,用什么来存储我们的打老鼠游戏每次的成绩呢?选择如下: 1:内存中.缺点,退出游戏, ...

  3. SpringBoot快速入门(必知必会)

    是什么?能做什么 SpringBoot必知必会 是什么?能做什么 SpringBoot是一个快速开发脚手架 快速创建独立的.生产级的基于Spring的应用程序 SpringBoot必知必会 快速创建应 ...

  4. 2015 前端[JS]工程师必知必会

    2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...

  5. [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

    http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...

  6. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  7. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  8. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  9. 闻道Go语言,6月龄必知必会

    大家好,我是马甲哥, 学习新知识, 我的策略是模仿-->归纳--->举一反三, 在同程倒腾Go语言一年有余,本次记录<闻道Go语言,6月龄必知必会>,形式是同我的主力语言C#做 ...

  10. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

随机推荐

  1. valid number 判断字符串是否为有效数字

    RT,面试题,给定一个字符串判断是否为科学计数法的有效数字.此题各种繁琐考虑.今天终于学会了用有限状态机来处理.理解之后简洁易懂.在此分享我的理解推导思路,大有收获啊. 网上有解法说先记录每个状态代表 ...

  2. PL/SQL Developer 连接Oracle数据库详细配置方法

    PL/SQL Developer 连接Oracle数据库详细配置方法 近段时间很多网友提出监听配置相关问题,客户终端(Client)无法连接服务器端(Server).本文现对监听配置作一简单介绍,给出 ...

  3. css-缩写

    border缩写 /*缩写前*/ element{ border-top-width:1px; border-top-style:solid; border-top-color:#cccccc; } ...

  4. 干净的架构The Clean Architecture

    干净的架构The Clean Architecture 这是著名软件大师Bob大叔提出的一种架构,也是当前各种语言开发架构.干净架构提出了一种单向依赖关系,从而从逻辑上形成一种向上的抽象系统. 我们经 ...

  5. SQLSever: 如何在select中的每一行产生不同的随机数?

    原文:SQLSever: 如何在select中的每一行产生不同的随机数? select 的随机函数有点假, 也许是因为它是基于时间来的吧, 同一select中由于时间无法错开导致产生的随机数都是一样的 ...

  6. 使用winform控件注意线程绘制界面冲突

    在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...

  7. MVC 在控制器中获取某个视图动态的HTML代码

    ASP.NET MVC 在控制器中获取某个视图动态的HTML代码   如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...

  8. Leetcode: UniquePath II

    Description: Follow up for "Unique Paths": Now consider if some obstacles are added to the ...

  9. js中内置有对象

    statpot:使用mongo+bootstrap+highcharts做统计报表 最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求 ...

  10. 公众平台Bee.WeiXin

    微信公众平台Bee.WeiXin开发介绍 阅读目录 开始 预览 配置项说明 调用链方式的应答 理解调用链上下文 自定义MVC响应 总结 我们来看一下如何通过Bee.WeiXin开发微信公众平台.关于微 ...