当自己在学习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命令行常见使用的操作

启动

  1. webpack

如果你想当改变一个文件而让webpack实时编译

  1. webpack --watch

如果你想把默认的配置文件webpack.config.js改成自定义文件

  1. webpack --config customconfig.js

webpack的用法


首先先贴上一个比较完整的webpack.config.js的代码,再详细介绍:

  1.  
  1. // webpack.config.js
  2. var path = require('path')
  3. var webpack = require('webpack')
  4.  
  5. module.exports = {
  6. entry: ['./src/index'],
  7. output: {
  8. path: path.join(__dirname, 'dist'),
  9. filename: 'bundle.js'
  10. },
  11. plugins: [
  12. new webpack.optimize.UglifyJsPlugin({
  13. compressor: {
  14. warnings: false,
  15. },
  16. }),
  17. new webpack.optimize.OccurenceOrderPlugin()
  18. ],
  19. module: {
  20. loaders: [{
  21. test: /\.css$/,
  22. loaders: ['style', 'css']
  23. }]
  24. }
  25. }

就像我在前面提到的,webpack.config.js的写法和在Node里的写法相同,我们主要看的就是文件中的module.exports里面的内容

  • entry 是指入口文件的配置项,它是一个数组的原因是webpack允许多个入口点。
  • output是指输出文件的配置项

    • path - 表示输出文件的路径
    • filename - 表示输出文件的文件名
  • plugins 顾名思义,使用插件可以给webpack添加更多的功能,使webpack更加的灵活和强大,webpack有两种类型的插件:

    • webpack内置的插件

      1. // 首先要先安装webpack模块
      2. var webpack = require("webpack");
      3.  
      4. module.exports = {
      5. new webpack.optimize.UglifyJsPlugin({
      6. compressor: {
      7. warnings: false,
      8. },
      9. })
      10. };
    • webpack外置插件

      比如:

      1. //npm install component-webpack-plugin 先要在安装该模版
      2. var ComponentPlugin = require("component-webpack-plugin");
      3. module.exports = {
      4. plugins: [
      5. new ComponentPlugin()
      6. ]
      7. }

    更多的插件以及插件的用法,大家可以到webpack的插件上查看。

    • module 配置处理文件的选项

      • loaders 一个含有wepback中能处理不同文件的加载器的数组

        • test 用来匹配相对应文件的正则表达式
        • loaders 告诉webpack要利用哪种加载器来处理test所匹配的文件
      • loaders 的安装方法

        1. $ npm install xxx-loader --save-dev

讲到这里,我相信大家都会对wepback有了更深的认识,但是却十分的松散,不能把它们串起来,那接下来我就用几个小的demo来让大家梳理梳理起来

举个例子

首先请大家建立一个和我一样文件结构的文件夹,在这里我也说明下这个demo大概要做的事情,就是将css文件都打包放到一个js文件,并且对图片解压,并且要对这个js文件进行自动压缩。

  1.  
  1. DemoOne
  2. |- dist
  3. |- src
  4. |- index.js
  5. |- index.html
  6. |- style.css
  7. |- demo.png(随便找一张图片就可以)
  8. |- package.json
  9. |- webpack.config.js

首先看index.html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>demo1</title>
  6. </head>
  7. <body>
  8. <div>Hello,world</div>
  9. <img src="./demo.png" alt="">
  10. <script src="../dist/bundlle.js"></script>
  11. </body>
  12. </html>

再看style.css

  1.  
  1. body{
  2. background:red;
  3. }
  1.  
  1.  

这个时候我们还没有写webpack.config.js,打开index.html,会看到

打开控制台后,你会发现

接下来,我们在webpack.config.js下加上如下代码

  1.  
  1. // webpack.config.js
  2. var path = require('path')
  3. var webpack = require('webpack');
  4.  
  5. module.exports = {
  6. entry: ['./src/index'],
  7. output: {
  8. path: path.join(__dirname, 'dist'),
  9. filename: 'bundle.js'
  10. },
  11. plugins: [
  12. new webpack.optimize.UglifyJsPlugin({
  13. compressor: {
  14. warnings: false,
  15. },
  16. })
  17. ],
  18. module: {
  19. loaders: [{
  20. test: /\.css$/,
  21. loaders: ['style', 'css']
  22. },
  23. {
  24. test: /\.(png|jpg)$/,
  25. loaders: [
  26. 'file?hash=sha512&digest=hex&name=[hash].[ext]',
  27. 'image-webpack?bypassOnDebug&optimizationLevel=7&interlaced=false'
  28. ]
  29. }]
  30. }
  31. }

当然,在开始用webpack之前,要先安装相对应的模块,解析css文件 图片文件以及因为要对文件进行压缩,所以也要用到上文中所说的webpack自身内置的插件,所以也要导入webpack模块

  1. $ npm install style-loader css-loader image-webpack-loader webpack --save-dev

安装好之后使用webpack命令后会有这样的提示

但是这个时候你打开浏览器会发现,页面依旧没有什么效果,这是肯定的!我想大家肯定知道下一步该怎么做了,没错!在入口文件里面增加内容

  1. require('./style.css');
  2. 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等一起使用。。。最后值得一提的是reactwebpack是一对绝佳cp啊,有木有!!

webpack学习之路的更多相关文章

  1. webpack学习之路01

    webpack是什么 1.模块化 能将css等静态文件模块化 2.借助于插件和加载器 webpack优势是什么 1.代码分离 各做各的 2.装载器(css,sass,jsx,es6等等) 3.智能解析 ...

  2. webpack学习之路--demo1

    1.不使用框架建立webpack项目时 (1).npm init -y 生成package.json文件 (2).npm install --save-dev webpack 在当前项目下安装webp ...

  3. jQuery学习之路(1)-选择器

    ▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...

  4. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  5. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

  6. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  7. [精品书单] C#/.NET 学习之路——从入门到放弃

    C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...

  8. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

  9. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

随机推荐

  1. 非常有用的GitHub链接

    平常开发工作中,我经常取Github上搜索项目,Clone下来学习使用,在这个过程中,发现了好多比较好的Github地址,记录下来,分享出去. image 非常有用的GitHub链接(顺序不分先后): ...

  2. JavaScript--AJAX页面传值

    1.首先 闲话不说 直接代码走起,都是我工作闲事的积累干货 //重要 js 运行 $(function (){ 代码 }); 2.ajax 传值 //第一种 输入框 <input type=&q ...

  3. KVO等具体实现步骤以及注意事项

    KVO是一种设计模式,名为观察者. addObserver:forKeyPath:options:context: 通知其他对象的方法,这个方法在NSObject中就已经申明了,也就是说任何继承自NS ...

  4. akka-stream与actor系统集成以及如何处理随之而来的背压问题

    这几天上海快下了五天的雨☔️☔️☔️☔️,淅淅沥沥,郁郁沉沉.     一共存在四个api: Source.actorRef,返回actorRef,该actorRef接收到的消息,将被下游消费者所消费 ...

  5. 《Linux系统编程手册》读书笔记——第2章基本概念

    操作系统的核心--内核 内核的职责 进程调度:Linux属于抢占式多任务操作系统,多个进程可同时驻留于内存,且每个进程都能获得对CPU的使用权.哪些进程获得对CPU的使用,以及每个进程能使用多长时间 ...

  6. mysql创建新用户及新用户不能本地登陆的问题

    最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...

  7. BLE抓包是怎么回事儿?

    BLE抓包 在进行网络开发的时候,抓包是一个很重要的调试过程,通过抓包可以分析网络传输的数据是否正确,可以深入理解网络传输过程.在物联网开发中,BLE低功耗蓝牙技术是一种非常通用的网络传输方式.在学习 ...

  8. 基于telegraf+influxdb+grafana进行postgresql数据库监控

    前言 随着公司postgresql数据库被广泛应用,尤其是最近多个项目在做性能测试的时候都是基于postgresql的数据库,为了确定性能瓶颈是否会出现在数据库中,数据库监控也被我推上了日程.在网上找 ...

  9. JavaScript函数(二)

    在前面我们已经对函数作了简单的介绍,比如函数的定义.函数的声明.函数的调用和函数的传参等.本节将进一步介绍函数的应用,深度理解函数的各种使用. 函数是一个对象,每个函数时Function类型的一个实例 ...

  10. Unix 文件系统读写时权限校验

    文件系统中的所有文件都是在读出或写入时进行权限校验 一个问题,如果一个用户对一个普通文件有读写权限,在使用vim编辑时,管理员撤销掉此用户对此文件的写入权限 那么,这个普通用户还可以将修改写入文件吗?