<什么是webpack>

webpack是一个模块打包器,任何静态资源(js、css、图片等)都可以视作模块,然后模块之间也可以相互依赖,通过webpack对模块进行处理后,可以打包成我们想要的静态资源。

gulp的打包是将js、css、图片等分开打包的,但是webpack是将所有的静态资源打包到一起,因此一个请求就可以了。

<webpack的特点>

·支持CommonJs(require的写法)和AMD模块,也就是说基本可以无痛迁移旧项目

·支持模块加载器和插件机制,可对模块灵活定制,特别是babel-loader,有效支持es6

·可以通过配置,打包成多个文件。有效利用浏览器的缓存功能提升性能。将公用的东西抽离出来,比如jQuery等

·将样式文件和图片等静态资源视为模块进行打包。配合loader加载器,支持sass、less等css预处理器

·内置有source map,即使打包在一起也方便调试

<webpack的安装>

1,先全局安装

npm install webpack -g

·webpack -w  提供watch方法,实时进行打包更新

·webpack -p 对打包后的文件进行压缩

·webpack -d 提供sourcemap,方便调试

·webpack --config 以某个config作为打包

·webpack --help 更多命令

2,再本地安装

npm init 先初始化一下,生成package.json。再安装,这样可以方便的查看依赖的文件

npm install webpack --save-dev 开发式依赖,一些打包工具,像gulp、webpack等都是开发式依赖,上线时并不需要

<webpack初体验>

比如说所有的文件打包到bundle.js中,则要在页面中引入bundle.js

webpack ./entry.js bundle.js   //编译entry.js并打包到bundle.js

<模块依赖>

·webpack会分析入口文件,解析包含依赖关系的各个文件

·这些文件(模块)都打包到bundle.js文件中

·webpack会给每个模块分配一个唯一的id并通过这个id索引和访问模块

·页面启动时先执行entry.js代码,其他的模块会在require时懒加载

<loader加载器>

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

·Loader可以理解为是模块和资源的转换器,可以转换任何类型(jsx、jade等)的模块

·Loader可以通过管道方式链式调用,每个loader可以把资源转换成任意格式并传递给下一个loader,但是最后一个loader必须返回JavaScript,因为webpack只认识js。不同的文件,使用的loader也不一样

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

·Loader可以通过npm安装

·Loader可以通过文件扩展名(或正则表达式)绑定不同的加载器

<加载css文件>

安装两个loader:npm install css-loader style-loader

·首先将style.css也看作一个模块

·用css-loader来读取它

·用style-loader把它内嵌到html中

在entry.js中引入:

require("css!./style.css")//相当于require("css-loader!.style.css").因为css-loader的-loader是固定的,所以一般省略-loader。
/*将原始的css通过css-loader读出来,需要传递给style-loader。所以该require还需要补充为如下所示:*/
require("style!css!./style.css")
//!相当于gulp中的流一样,从右向左依次流动

再次执行

webpack ./entry.js bundle.js   
编译entry.js引入的样式文件打包到bundle.js

<加载图片url-loader>

url-loader会将样式中引用到的图片转为模块来处理

npm install url-loader

limit的参数意思是图片大小小于这个限制的时候,会自动启用base64编码图片

<配置文件>

·webpack在执行的时候可以通过指定的配置文件

·默认情况下会执行当前目录中的webpack.config.js,当输入webpack时,会自动寻找该文件。

·配置文件是一个node.js模块,返回一个json格式的配置信息对象

·添加配置文件,然后执行webpack --progress --colors就可以了

配置文件格式为:

var webpack = require("webpack")
module.exports = {
entry:"./entry.js",//指定打包的入口文件,每个键值对,就是一个入口文件。
output:{//配置打包结果
path:__dirname,//定义了输出的文件夹
filename:"bundle.js"//定义了打包结果文件的名称
},
module:{//定义了模块的加载逻辑
loaders:[//定义了一系列的加载器
{test:/\.css$/,loader:"style!css"},//当需要加载的文件匹配`test`的正则时,就会使用相应的loader
        {test:/\.(png|jpg)$/,loader:"url?limit=40000"},
        {test:/\.js?$/,loader:"babel",exclude:/node_modules/,query:{compact:false,presets:['es2015']}}//对于所有的js文件,用babel-loader
                                                                 //进行加载,忽略node_modules下面
                                                                // 的js文件。query表示参数,相当于
                                                                // url-loader的?形式。
]
},
plugins:[//插件的使用一般在webpack配置信息plugins选项中指定,我们可以向生成的打包文件头部插入一些信息
  new webpack.BannerPlugin("//叮呤在学习webpack"),//向打包之后的文件头部添加注释信息
   new webpack.optimize.CommonChunkPlugin("common.js")//把多个模块中的公共部分,单独提取出来,单独加载
],
resolve:{
alias:{//别名,它的作用是把用户的一个请求重定向到另一个路径
    jquery:"./js/jquery.js" //这样,在使用jQuery的组件中只需要require("jquery")即可,而不再需要逐级去寻找jQuery的存放位置
}
}
}

  ·expose,如果想在前台使用打包的jQuery,需要把jQuery暴露出来,先安装该模块 npm install expose-loader --save-dev

  eg:把$作为别名为jquery的变量暴露到全局上下文中require("expose?$!jquery"),在引入jquery的时候,把jQuery对象绑定到window的$上面

  ·entry属性可以使一个对象,而对象名也就是key,会作为下面output的filename属性的name

  entry:{

    bundle1:"./entry1.js",

    bundle2:"./entry2.js"

  }

  output:{

    path:__dirname,

    filename:"[name].js"//此处的[name]就表示bundle1和bundle2

  }

  假如bundle1和bundle2都包含有功能相同的部分,则可以把这部分提取出来

  ·公共模块。我们利用插件可以智能的提取公共部分,以提供我们浏览器的缓存复用

  plugins:[

      new webpack.optimize.CommonChunkPlugin("common.js")//把多个模块中的公共部分,单独提取出来,单独加载

      ]

  我们需要手动在html上加载common.js,并且是必须最先加载

<使用es6>

npm install babel-core --save-dev

npm install babel-loader --save-dev

npm install babel-preset-es2015

<webpack-dev-server>

npm install webpack-dev-server -g

安装好之后,执行webpack-dev-server,在当前目录启动一个express服务,会自动打包和实时刷新

<与webpack相比gulp的优势>

webpack不可以做自动部署和代码检查,webpack只是个打包工具。所以可以采用gulp与webpack混合使用的方法

var gutil = require("gulp-util");
var webpack = require("webpack");
var webpackConfig = require("./webpack.config.js");
gulp.task("webpack",function(callback){
var myConfig = Object.create(webpackConfig);
webpack(myConfig,function(err,stats){
callback();
})
})
gulp.task("default",function(){
  gulp.watch("./**",["webpack"]);
})

好用的打包工具webpack的更多相关文章

  1. 打包工具webpack和热加载深入学习

    本次小编呢,为大家带来一篇深入了解打包工具 webpack. 我们今天使用的是 webpack3.8.1版本的,我们学习使用 3.8.1更稳定些,并学习自己如何配置文件,最新版本不需要自己配置文件,但 ...

  2. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  3. 模块化管理工具兼打包工具 webpack

    webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...

  4. 打包工具webpack安装·Mac

    最近在学Vue.js,是我接触的第一个前端框架.本来感觉还不错,各种惊叹于它可以用很少的代码写出那种具备交互能力的神奇模块. 在学的过程中总是能碰到一个叫webpack的单词,查过,是一个模块打包器, ...

  5. 模块打包工具webpack

    1.webpack的安装 1.1在安装node的基础上,npm install -g webpack(window版本,因为是全局安装,所以无所谓是哪个路径下) 1.2新建一个文件夹用于此项目  eg ...

  6. Webpack:前端资源模块化管理和打包工具

    一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...

  7. webpack模块化管理和打包工具

    Webpack简介 webpack是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际 需要的 ...

  8. 透过实现小型打包工具理解webpack

    面试经常有问到 webpack,偶遇一篇比较有实用价值的且有利于理解的文章,现总结如下: 本篇文章中要实现的这个迷你打包工具,它主要能实现如下两个功能: ①.将 ES6 转换成 ES5: ②.支持在 ...

  9. webpack打包和gulp打包工具详细教程

    30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...

随机推荐

  1. ApacheHttpServer出现启动报错:the requested operation has failed解决办法

    转自:https://www.jb51.net/article/21004.htm 原因一:80端口占用 例如IIS,另外就是迅雷.我的apache服务器就是被迅雷害得无法启用! 原因二:软件冲突 装 ...

  2. Django 使用简单笔记

    1. Django项目的启动: 1. 命令行启动 在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指 ...

  3. 在CNN上增加一层CAM告诉你CNN到底关注什么

    Cam(Class Activation Mapping)是一个很有意思的算法,他能够将神经网络到底在关注什么可视化的表现出来.但同时它的实现却又如此简介,相比NIN,googLenet这些使用GAP ...

  4. [HNOI2015]亚瑟王(概率dp)

    题面太长了就不复制了,传送门 一道做了还是很懵逼的题目,感觉以后碰到类似的还是不会,果然HNOI题目很皮. 题解传送 补充一下吧.//感觉他的博客已经写得很好了......Orz 需要的可以两边一起看 ...

  5. Sass函数:数字函数-ceil()函数

    ceil() 函数将一个数转换成最接近于自己的整数,会将一个大于自身的任何小数转换成大于本身 1 的整数.也就是只做入,不做舍的计算: >> ceil(2.0) 2 >> ce ...

  6. Vue:子组件如何跟父组件通信

    我们知道,父组件使用 prop 传递数据给子组件.但子组件怎么跟父组件通信呢?这个时候 Vue 的自定义事件系统就派得上用场了. 使用 v-on 绑定自定义事件 每个 Vue 实例都实现了事件接口,即 ...

  7. hive之视图和索引

    一.视图 1.视图定义 视图其实是一个虚表,视图可以允许保存一个查询,并像对待表一样对这个查询进行操作,视图是一个逻辑结构,并不会存储数据. 2.视图的创建 通过创建视图来限制数据访问可以用来保护信息 ...

  8. C#基础提升系列——C#异步编程

    C#异步编程 关于异步的概述,这里引用MSDN的一段文字: 异步编程是一项关键技术,使得能够简单处理多个核心上的阻塞 I/O 和并发操作. 如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则 ...

  9. java 标准输入输出流,打印流,数据流

    1 package stream; import static org.junit.Assert.assertNotNull; import java.io.BufferedReader; impor ...

  10. [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)

    题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...