webpack学习--webpack经典7分钟入门教程


Posted in Javascript onJune 28, 2017

一.什么是 Webpack

Webpack 是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

webpack学习--webpack经典7分钟入门教程

webpack模式图

二.为什么使用webpack

市面上已经存在的模块管理和打包工具并不适合大型的项目,尤其单页面 Web 应用程序。最紧迫的原因是如何在一个大规模的代码库中,维护各种模块资源的分割和存放,维护它们之间的依赖关系,并且无缝的将它们整合到一起生成适合浏览器端请求加载的静态资源。而webpack有以下几个优点:

1.将依赖树拆分成按需加载的块:Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的快。在优化了依赖树后,每一个异步区块都作为一个文件被打包。

2.初始化加载的耗时尽量少:Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。

3.各种静态资源都可以视作模块:Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。

4.将第三方库整合成模块的能力:Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。

5.自定义打包逻辑的能力:Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。

6.适合大项目,无论是单页还是多页的 Web 应用

三.安装webpack

首先要安装 Node.js, Node.js 自带了软件包管理器 npm,Webpack 需要 Node.js v0.6 以上支持,建议使用最新版 Node.js。

用 npm 安装 Webpack:

$ npm install webpack -g

此时 Webpack 已经安装到了全局环境下,本课程中我们已装好webpack,可以通过命令行 webpack -h 试试。

通常我们会将 Webpack 安装到项目的依赖中,这样就可以使用项目本地版本的 Webpack。

1.进入项目目录

2.确定已经有 package.json,没有就通过 npm init 创建

3.输入命令 $ npm install webpack --save-dev 安装 webpack 依赖

Webpack 目前有两个主版本,一个是在 master 主干的稳定版,一个是在 webpack-2 分支的测试版,测试版拥有一些实验性功能并且和稳定版不兼容,在正式项目中应该使用稳定版。

# 查看 webpack 版本信息
$ npm info webpack
# 安装指定版本的 webpack
$ npm install webpack@1.12.x --save-dev

四.在项目中使用webpack

首先有一个静态页面 index.html,

<!-- index.html -->
<html>
<head>
 <meta charset="utf-8">
</head>
<body>
 <script src="bundle.js"></script>
</body>
</html>

现在创建一个 JS 入口文件 entry.js:

// entry.js
 pico entry.js
 // 进入编辑器输入
 document.write('It works.');
 // 保存并退出

然后编译 entry.js 并打包到 bundle.js,运行命令:

$ webpack ./entry.js bundle.js

如果成功,打包过程会显示日志:

Hash: aeec068c58e1e78f0fb6
 Version: webpack 1.12.9
 Time: 70ms
 Asset   Size Chunks       Chunk Names
 bundle.js 1.48 kB    0 [emitted] main
 [0] ./entry.js 87 bytes {0} [built]

在点击访问测试将会打开一个新的窗口。它应该会显示It works.。

注意:下面的课程中创建编辑文件都是用pico 文件名。

下一步,我们将把一些代码移到一个额外的文件中content.js 并修改入口 entry.js:

// content.js
 pico content.js
 // 编辑内容
 module.exports = "It works from content.js.";
// 修改entry.js
 //document.write('It works.');
 document.write(require("./content.js")); // 添加content.js

编译文件

$ webpack ./entry.js bundle.js

更新您的浏览器窗口,您应该看到文本It works from content.js.

执行成功,会显示

Hash: ef96fed65f6d3ebc0dd7
Version: webpack 1.12.9
Time: 91ms
  Asset  Size Chunks       Chunk Names
bundle.js 1.7 kB    0 [emitted] main
  [0] ./entry.js 133 bytes {0} [built]
  [1] ./content.js 97 bytes {0} [built]

Webpack 会分析入口文件,解析包含依赖关系的各个文件。这些文件(模块)都打包到 bundle.js 。Webpack 会给每个模块分配一个唯一的 id 并通过这个 id 索引和访问模块。在页面启动时,会先执行 entry.js 中的代码,其它模块会在运行 require 的时候再执行。

五.Loader介绍和使用

Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。

Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为参数,返回转换的结果。这样,我们就可以通过 require 来加载任何类型的模块或文件,比如 CoffeeScript、 JSX、 LESS 或图片。

loader 有以下这些特点:

1.Loader 可以通过管道方式链式调用,每个 loader 可以把资源转换成任意格式并传递给下一个 loader ,但是最后一个 loader 必须返回 JavaScript。

2.Loader 可以同步或异步执行。

3.Loader 运行在 node.js 环境中,所以可以做任何可能的事情。

4.Loader 可以接受参数,以此来传递配置项给 loader。

5.Loader 可以通过文件扩展名(或正则表达式)绑定给不同类型的文件。

6.除了通过 package.json 的 main 指定,通常的模块也可以导出一个 loader 来使用。

7.Loader 可以访问配置。

8.插件可以让 loader 拥有更多特性。

9.Loader 可以分发出附加的任意文件。

我们想要在应用中添加一个css文件。

WebPACK只能处理JavaScript本身,所以我们需要css-loader去处理 CSS。我们还需要style-loader去应用这个样式在CSS文件。

安装 loader:

npm install css-loader style-loader

注意:安装 loaders(只需要在本地安装,不需 -g)将会创建一个 node_modules 文件夹,在哪里 loaders 将会激活。

我们要在页面中引入一个 CSS 文件 style.css,首页将 style.css 也看成是一个模块,然后用 css-loader 来读取它,再用 style-loader 把它插入到页面中。

添加一个style.css文件

body {
  background: blue;
}

修改 entry.js:

+ require("!style!css!./style.css");  // 载入 style.css
 document.write(require("./content.js"));

重新编译并更新您的浏览器看到蓝色背景。

扩展名自动绑定loader

如果每次 require CSS 文件的时候都要写 loader 前缀,是一件很繁琐的事情。

我们可以根据模块类型(扩展名)来自动绑定需要的 loader这样写require("./style.css")。

修改entry.js

- require("!style!css!./style.css");
+ require("./style.css");
 document.write(require("./content.js"));

注意:-表示这行删掉或者注释掉,+表示新增的内容。

编译:

webpack ./entry.js bundle.js --module-bind "css=style!css"

注意:!在shell中有特殊意义,需要转义,这样写才会成功的

webpack ./entry.js bundle.js --module-bind "css=style!css"

六.配置文件

Webpack 在执行的时候,除了在命令行传入参数,还可以通过指定的配置文件来执行。默认情况下,会搜索当前目录的 webpack.config.js 文件,这个文件是一个 node.js 模块,返回一个 json 格式的配置信息对象,或者通过 --config 选项来指定配置文件。

我们想将配置选项移动到配置文件中,创建一个配置文件 webpack.config.js:

module.exports = {
  entry: "./entry.js",
  output: {
    path: __dirname,
    filename: "bundle.js"
  },
  module: {
    loaders: [
      { test: /.css$/, loader: "style!css" }
    ]
  }
};

现在我们仅仅运行:

webpack

如果完成成功,将会返回运行结果,该命令将尝试WebPACK当前目录中加载文件webpack.config.js。

这里对Webpack的打包行为做了配置,主要分为几个部分:

  1. entry:指定打包的入口文件,每有一个键值对,就是一个入口文件
  2. output:配置打包结果,path定义了输出的文件夹,filename则定义了打包结果文件的名称
  3. module:定义了对模块的处理逻辑,这里可以用loaders定义了一系列的加载器,以及一些正则。当需要加载的文件匹配test的正则时,就会调用后面的loader对文件进行处理,这正是webpack强大的原因。

漂亮的输出

如果该项目的增长,编译可能需要更长的时间。所以我们要展示一些进度条。我们想要的颜色…

我们可以这样

webpack --progress --colors

七.插件

插件可以完成更多 loader 不能完成的功能。

插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。

Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方插件。

接下来,我们利用一个最简单的 BannerPlugin 内置插件来实践插件的配置和运行,这个插件的作用是给输出的文件头部添加注释信息。

修改 webpack.config.js,添加 plugins:

var webpack = require('webpack');
module.exports = {
 entry: './entry.js',
 output: {
  path: __dirname,
  filename: 'bundle.js'
 },
 module: {
  loaders: [
   {test: /.css$/, loader: 'style!css'}
  ]
 },
 plugins: [
  new webpack.BannerPlugin('This file is created by mutouren')
 ]
}

然后运行 webpack,打开 bundle.js,可以看到文件头部出现了我们指定的注释信息:

/! This file is created by mutouren /
/**/ (function(modules) { // webpackBootstrap
/**/   // The module cache
/**/   var installedModules = {};
// 后面代码省略......

一个 url-loader 来说,它会将样式中引用到的图片转为模块来处理,使用该加载器需要先进行安装:

npm install url-loader

修改style.css文件

body {
  color:#fff;
  background: url('./logo.png');
}

配置webpack.config.js文件

module.exports = {
  entry: "./entry.js",
  output: {
    path: __dirname,
    filename: "bundle.js"
  },
  module: {
    loaders: [
      { test: /.css$/, loader: "style!css" },
      { test: /.(png|jpg)$/, loader: "url?limit=40000" }  // 添加到这
    ]
  }
};

注意后面那个limit的参数,当你图片大小小于这个限制的时候,会自动启用base64编码图片。

我们还是运行

webpack

将会看到背景图片已设置成功。

八.在 Webpack 中使用别名

模块别名定义,方便后续直接引用别名,无须多写长长的地址,比如我们现在想要把scripts/jquery.min.jsjquery压缩文件打包.

别名(resolve.alias) 是 Webpack 的一个配置项,它的作用是把用户的一个请求重定向到另一个路径,例如通过修改 webpack.config.js 配置文件,jquery为别名加入:

resolve: {
 alias: {
   jquery: "./scripts/jquery.min.js"
 }
}

例如我们之前不用别名,在entry.js中,想要把jquery打包

require('./scripts/jquery.min.js');

设置别名,就可以修改为

require('jquery');

这样待打包的脚本中的 require('jquery'); 其实就等价于 require('./scripts/jquery.min.js'); 。通过别名的使用在本例中可以减少几乎一半的时间。

我们把需要的jquery打包了,但是现在前台页面想要直接用还是不可以的,需要我们把jquery暴露出来。

你可能在全局中使用了一个压缩版本的 jquery,为了修复你可以安装这个暴露全局加载器

npm install expose-loader --save-dev

然后像下面这样修改entry.js:

require('expose?$!jquery');

把$作为别名为jquery的变量暴露到全局上下文中。

现在我们在页面就可以使用$,例如:

$('h1').text();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
jQuery实现的多屏图像图层切换效果实例
May 07 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
提高JavaScript执行效率的23个实用技巧
Mar 01 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 Javascript
Vue管理系统前端之组件拆分封装详解
Aug 23 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
Sep 07 Javascript
PHP 502bad gateway原因及解决方案
Nov 13 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
Jun 28 #Javascript
vue2项目使用sass的示例代码
Jun 28 #Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 #Javascript
详解webpack+angular2开发环境搭建
Jun 28 #Javascript
JavaScript中最常用的10种代码简写技巧总结
Jun 28 #Javascript
AngularJS页面带参跳转及参数解析操作示例
Jun 28 #Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
Jun 28 #Javascript
You might like
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
url decode problem 解决方法
2011/12/26 PHP
CI框架中zip类应用示例
2014/06/17 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
php搜索文件程序分享
2015/10/30 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP多进程简单实例小结
2019/11/09 PHP
关于JS字符串函数String.replace()
2013/04/07 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
python实现挑选出来100以内的质数
2015/03/24 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
浅谈五大Python Web框架
2017/03/20 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Python 切分数组实例解析
2019/11/07 Python
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
青年教师培训方案
2014/02/06 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
公司收款委托书范本
2014/09/20 职场文书
班主任先进事迹材料
2014/12/17 职场文书
2016公司新年问候语
2015/11/11 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
导游词之江西赣州
2019/10/15 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python