<什么是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. 从“中产梦”中醒来,好好打工吧

    "中产"定义 自打"中产阶级/阶层"概念出现,总有人试图给出定义.搞不清何为"中产"却试图定义"中产阶级/阶层",注定是 ...

  2. [转载]Redux原理(一):Store实现分析

    写在前面 写React也有段时间了,一直也是用Redux管理数据流,最近正好有时间分析下源码,一方面希望对Redux有一些理论上的认识:另一方面也学习下框架编程的思维方式. Redux如何管理stat ...

  3. valueOf()对象返回值

    valueOf()对象返回值 Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起.其操作与 Array.toString 和 Array.join 方法相同. Boolean为Boo ...

  4. php中的花括号使用详解

    1.简单句法规则(用花括号界定变量名,适用于PHP所有版本,是php系统设定):    $a = 'flower';    echo "She received some $as" ...

  5. linux ---JDK的安装与配置--两种方式

    linux下的JDK的安装与配置:JDK的安装有两种方式: tar包和rpm安装1.tar包安装: 下载地址:http://www.oracle.com/technetwork/java/javase ...

  6. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  7. spring data mongodb CURD

    一.添加 Spring  Data  MongoDB 的MongoTemplate提供了两种存储文档方式,分别是save和insert方法,这两种的区别: (1)save :我们在新增文档时,如果有一 ...

  8. PL SQL安装

    首先,在官网下载PL SQL 的对应版本,本机是64位的就下载64位的,网址:https://www.allroundautomations.com/downloads.html#PLS 点击应用程序 ...

  9. Python3.5-20190530-unittest模块

    >>> dir(unittest) #所有的属性和方法 ['BaseTestSuite', 'FunctionTestCase', 'SkipTest', 'TestCase', ' ...

  10. JavaSE---锁

    1.概述 java中提供了种类丰富的锁, 每种锁因其特性不同,在合适的场景下发挥非常高的效率: