webpack学习之路
当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家指出。
在我们开始之前
- webpack有多种加载器(Loader,后面会介绍),可以处理各种需要被处理的静态文件
- webpack支持CommonJs AMD CMD规范
在使用webpack的项目中,默认配置文件为
webpack.config.js
, 模块文件,和Node写法一样,对外暴露接口,主要属性有:- plugins插件项
- entry入口文件配置项
- output对应输出项配置
- module.loaders 最关键的配置,告知webpack不同的文件需要什么加载器进行处理
模块系统的几种类型
<script>
标签类型- 缺点
- 全局作用域下造成变量的冲
- 文件加载顺序很重要
- 模块与模块之间的依赖要解决
- 在大型项目中难以维护和管理
- 缺点
CommonJs
优点
- 服务端模块能够重复利用
- 有优秀的包管理工具npm
- 简单,上手容易
缺点
- 不适合浏览器端的使用
- 不能做到并行加载模块
AMD
优点
- 适合浏览器的异步加载机制
- 并行加载模块
- 缺点
- 代码难以经营和维护
ES6
优点
- 未来的ES规范
缺点
- 浏览器对ES6的支持还需要一段时间
- 能够依赖的现有的模块少
' 转换 ' 的思想
模块要能够在客户端中去执行,则必须将它们从 server => browser
极端的想法:
- 一个请求一个模块 只有需要的模块会被转换,但是耗费资源,时间长
- 所有请求都在一个模块 不需要的模块也会被转换 时间短,耗费资源少
分块转换的想法:
- 将众多的模块切成许多片,在初始化时的请求不会包括完整的代码,并且在初始化时不需要的模块切片会在后续加载过程中按需加载。并且将模块化的切片方式是可以有开发人员自己定义的。
wepback它的目标是是什么?
webpack它能将依赖的模块转化成可以代表这些包的静态文件
它的目标有
- 将依赖的模块分片化,并且按需加载
- 解决大型项目初始化加载慢的问题
- 每一个静态文件都可以看成一个模块
- 可以整合第三方库
- 能够在大型项目中运用
- 可以自定义切割模块的方式
webpack较之其他类似工具有什么不同?
- 有同步和异步两种不同的加载方式
- Loader,加载器可以将其他资源整合到JS文件中,通过这种方式,可以讲所有的源文件形成一个模块
- 优秀的语法分析能力,支持 CommonJs AMD 规范
- 有丰富的开源插件库,可以根据自己的需求自定义webpack的配置
webpack为什么要将所有资源放在一个文件里面?
我们知道,对于浏览器来说,加载的资源越少,响应的速度也就越快,所以有时候我们为了优化浏览器的性能,会尽可能的将资源合并到一个主文件app.js
里面。但是这导致的很大的缺点:
- 当你的项目十分庞大的时候,不同的页面不能做到按需加载,而是将所有的资源一并加载,耗费时间长,性能降低。
- 会导致依赖库之间关系的混乱,特别是大型项目时,会变得难以维护和跟踪。比如:哪些文件是需要A模块加载完后才能执行的?哪些页面会受到多个样式表同时影响的? 等许多问题。
而webpack可以很好的解决以上缺点,因为它是一个十分聪明的模块打包系统,当你正确配置后,它会比你想象中的更强大,更优秀。
开启wbpack之旅
安装webpack
我们可以直接使用npm进行全局安装
npm install webpack -g
在常规项目中把webpack依赖加入到package.json
npm init
npm install webpack --save
更详尽的安装方法个可以参考webpack安装
webpak命令行常见使用的操作
启动
webpack
如果你想当改变一个文件而让webpack实时编译
webpack --watch
如果你想把默认的配置文件webpack.config.js
改成自定义文件
webpack --config customconfig.js
webpack的用法
首先先贴上一个比较完整的webpack.config.js
的代码,再详细介绍:
// webpack.config.js
var path = require('path')
var webpack = require('webpack') module.exports = {
entry: ['./src/index'],
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compressor: {
warnings: false,
},
}),
new webpack.optimize.OccurenceOrderPlugin()
],
module: {
loaders: [{
test: /\.css$/,
loaders: ['style', 'css']
}]
}
}
就像我在前面提到的,webpack.config.js
的写法和在Node里的写法相同,我们主要看的就是文件中的module.exports
里面的内容
- entry 是指入口文件的配置项,它是一个数组的原因是webpack允许多个入口点。
output是指输出文件的配置项
- path - 表示输出文件的路径
- filename - 表示输出文件的文件名
plugins 顾名思义,使用插件可以给webpack添加更多的功能,使webpack更加的灵活和强大,webpack有两种类型的插件:
webpack内置的插件
// 首先要先安装webpack模块
var webpack = require("webpack"); module.exports = {
new webpack.optimize.UglifyJsPlugin({
compressor: {
warnings: false,
},
})
};webpack外置插件
比如:
//npm install component-webpack-plugin 先要在安装该模版
var ComponentPlugin = require("component-webpack-plugin");
module.exports = {
plugins: [
new ComponentPlugin()
]
}
更多的插件以及插件的用法,大家可以到webpack的插件上查看。
module 配置处理文件的选项
loaders 一个含有wepback中能处理不同文件的加载器的数组
- test 用来匹配相对应文件的正则表达式
- loaders 告诉webpack要利用哪种加载器来处理test所匹配的文件
loaders 的安装方法
$ npm install xxx-loader --save-dev
讲到这里,我相信大家都会对wepback有了更深的认识,但是却十分的松散,不能把它们串起来,那接下来我就用几个小的demo来让大家梳理梳理起来
举个例子
首先请大家建立一个和我一样文件结构的文件夹,在这里我也说明下这个demo大概要做的事情,就是将css文件都打包放到一个js文件,并且对图片解压,并且要对这个js文件进行自动压缩。
DemoOne
|- dist
|- src
|- index.js
|- index.html
|- style.css
|- demo.png(随便找一张图片就可以)
|- package.json
|- webpack.config.js
首先看index.html
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo1</title>
</head>
<body>
<div>Hello,world</div>
<img src="./demo.png" alt="">
<script src="../dist/bundlle.js"></script>
</body>
</html>
再看style.css
body{
background:red;
}
这个时候我们还没有写webpack.config.js
,打开index.html
,会看到
打开控制台后,你会发现
接下来,我们在webpack.config.js
下加上如下代码
// webpack.config.js
var path = require('path')
var webpack = require('webpack'); module.exports = {
entry: ['./src/index'],
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compressor: {
warnings: false,
},
})
],
module: {
loaders: [{
test: /\.css$/,
loaders: ['style', 'css']
},
{
test: /\.(png|jpg)$/,
loaders: [
'file?hash=sha512&digest=hex&name=[hash].[ext]',
'image-webpack?bypassOnDebug&optimizationLevel=7&interlaced=false'
]
}]
}
}
当然,在开始用webpack之前,要先安装相对应的模块,解析css文件 图片文件以及因为要对文件进行压缩,所以也要用到上文中所说的webpack自身内置的插件,所以也要导入webpack模块
$ npm install style-loader css-loader image-webpack-loader webpack --save-dev
安装好之后使用webpack
命令后会有这样的提示
但是这个时候你打开浏览器会发现,页面依旧没有什么效果,这是肯定的!我想大家肯定知道下一步该怎么做了,没错!在入口文件里面增加内容
require('./style.css');
require('./demo.png');
再运行webpack
,出现上图类似提示后,打开浏览器,你会发现变成了这个样子
并且在dist
文件夹内,多出了两个文件,一个f1341ce5ea165e06ec3358441b52d5ea.png
(随机产生的名字)如果你想获得这个名字,可以将require('./demo.png')
输出查看,以及还有bundle.js
,比较图片前后的大小,
可以发现,文件大小发生了改变。打开bundle.js
你会发现该文件也被压缩了。是不是感觉很神奇?! 还有一个比较好玩的插件htmlwebpackplugin可以点击这里看看,把上面的例子改变下哦。
最后
我相信看到这里你对webpack
一定有了一定的认识,其实webpack
还有很多强大的功能,比如,webpack-dev-server
可以自动生成一个小型的NodeJs Express
服务器从而实现webpack十分实用的功能热替换(HMR) 和其它的工具gulp
grunt
等一起使用。。。最后值得一提的是react
和webpack
是一对绝佳cp啊,有木有!!
webpack学习之路的更多相关文章
- webpack学习之路01
webpack是什么 1.模块化 能将css等静态文件模块化 2.借助于插件和加载器 webpack优势是什么 1.代码分离 各做各的 2.装载器(css,sass,jsx,es6等等) 3.智能解析 ...
- webpack学习之路--demo1
1.不使用框架建立webpack项目时 (1).npm init -y 生成package.json文件 (2).npm install --save-dev webpack 在当前项目下安装webp ...
- jQuery学习之路(1)-选择器
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...
- webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口
webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- Redis——学习之路四(初识主从配置)
首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...
- Redis——学习之路三(初识redis config配置)
我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. ...
随机推荐
- 【java设计模式】【创建模式Creational Pattern】单例模式Singleton Pattern
//饿汉式:资源利用率较低(无论是否需要都会创建),性能较高(使用前无需判断实例是否存在,可直接使用) public class EagerSingleton{ private static fina ...
- 【java设计模式】代理模式
计算类中方法运行时间的几种方案: Client: package com.tn.proxy; public class Client { public static void main(String[ ...
- ASP.NET Core MVC请求超时设置解决方案
设置请求超时解决方案 当进行数据导入时,若导入数据比较大时此时在ASP.NET Core MVC会出现502 bad gateway请求超时情况(目前对于版本1.1有效,2.0未知),此时我们需要在项 ...
- [array] leetcode - 34. Search for a Range - Medium
leetcode - 34. Search for a Range - Medium descrition Given an array of integers sorted in ascending ...
- tesserat训练中文备忘录
最近用OCR识别身份证,用的tesseract引擎.但是google自带的中文库是在太慢了,尤其是对于性别.民族这样结果可以穷举的特征信息而言,完全可以自己训练字库.自己训练字库不仅可以提高识别速度, ...
- signalr中Group 分组群发消息的简单使用
前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...
- [Maximize ∑arr[i]*i of an Array]
Given an array of N integers. Your task is to write a program to find the maximum value of ∑arr[i]*i ...
- jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解 ----转载
1.(function($) {-})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...
- Node.js平台的一些使用总结
Node.js的安装 菜鸟教程 npm -v查看npm的版本. npm更新 npm官网 npm权限问题 由于npm经常会因为权限问题,不能全局安装模块,所以解决办法如下: npm官网 npm切换淘宝源 ...
- SQLServer 查看SQL语句的执行时间
在MSSQL Server中通过查看SQL语句执行所用的时间,来衡量SQL语句的性能. 通过设置STATISTICS我们可以查看执行SQL时的系统情况.选项有PROFILE,IO ,TIME.介绍如下 ...