<什么是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. 【JAVA】 04-Java中的多线程

    链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: 多线程引入 概述 多线程: 进程:正在执行中的程序,其 ...

  2. JSON对象与JavaScript对象的区别

    //js对象的字面量表示法: var people1={ name:'hehe', age:18 }; //json的格式是: var people1={ "name":'hehe ...

  3. java随机数Math.random()

    double random=Math.random();//返回[0,1)随机数 (int)(Math.random()*6)//返回0-5:随机数 (int)(Math.random()*6+1)/ ...

  4. js 程序执行与顺序实现详解

    JavaScript是一种描述型脚本语言,由浏览器进行动态的解析与执行,浏览器对于不同的方式有不同的解析顺序,详细介绍如下,感兴趣的朋友可以参考下哈 函数的声明和调用 JavaScript是一种描述型 ...

  5. 312-金胜维 P系列2.5寸 480G SATA3 SSD固态硬盘

    金胜维 P系列2.5寸 480G SATA3 SSD固态硬盘 一.概述     P系列为KingSpec金胜维针对入门级消费群体推出的一款高性价SSD固态硬盘,采用7mm超薄金属冲压外壳,板载优质TL ...

  6. U盘装CENTOS操作系统

    一.制作U盘系统镜像 1).用UltralISO软件打开下载好的ISO文件镜像,“文件”-“打开”,选中下载好的ISO镜像 2)点击“启动”-“写入硬盘镜像”,选中需要写入的U盘(容量最少为8G),点 ...

  7. 判断是否为PC

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  8. SPOJ7258 SUBLEX - Lexicographical Substring Search

    传送门[洛谷] 心态崩了我有妹子 靠 我写的记忆化搜索 莫名WA了 然后心态崩了 当我正要改成bfs排序的时候 我灵光一动 md我写的i=0;i<25;i++??? 然后 改过来就A掉了T^T ...

  9. CF 36E Two Paths

    传送门 真实的自闭= =+ 考试的时候老师明明说了可以路径为空T^T 然后光荣的挂掉了 20分的链[明明是最送分的] 上来就看出来欧拉回路了嘛 然后思考了一下大概奇点配个对 删一条简单路径剩下的跑欧拉 ...

  10. orcad原理图与PSPICE模型库名称

    Vendor PSpice Model Description Advanced Linear Devices adv_lin.lib Library of op-amps Advanced Line ...