1 什么是webpack

webpack是一个模块打包器,可以递归的构建一个依赖关系图,其中包含每个程序需要的每个模块,然后将所有模块打包成一个或多个bundle。他和其他的工具最大的不同在于他支持code-splitting、模块化(AMD,ESM,CommonJs)、全局分析。

bundle:bundle即由webpack打包出来的文件。

依赖关系:一个文件依赖于另一个文件,webpack就把这种关系视为依赖关系。所以webpack可以接受非代码资源,并把它们当做依赖提供给应用程序。

2 主要概念

入口:entry指示webpack使用哪个文件作为构建依赖图的开始。

出口: output指示webpack将打包好的bundles,如何命名以及输出到哪里。

loader:loader可以让webpack如处理那些非JS文件,将起转化为模块(webpack只理解JS)

插件:plugins可以打包优化和压缩等处理各种各样的任务。

模式:mode设置为开发还是生产环境

  const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件 module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'my-first-webpack.bundle.js'
},
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
],
mode:'production' || 'development'
};

3 详细示例

3.1 入口 entry

module.exports = {
// 单个入口
entry: './path/to/my/entry/file.js' // 为单个入口文件赋值名字
entry: {
main: './path/to/my/entry/file.js'
} // 多文件多入口,一般用于分离 应用程序(app) 和 第三方库(vendor) 入口
entry: {
app: './src/app.js',
vendors: './src/vendors.js'
}
}

3.2 输出 output

即使有多个入口文件,也只能规定一个输出配置

module.exports = {
// 最低要求,filename和path
output:{
filename:'bundle.js',
path: '/home/proj/public/assets'
} // 如果有多个入口文件,即生成多个单独的"chunk",则要使用占位符来确保每个文件具有唯一的名字
output: {
filename: '[name].js',
path: __dirname + '/dist'
} }

3.3 模式 mode

module.exports = {
mode: 'production' //生产
mode: 'development' //开发
};

3.4 loader

由于webpack无法处理除了JS以外的文件,所以loader发挥了重要的作用。

loader用于对模块的源代码进行转换,即将不同的语言转化为js,或将内联图转化为 data URL,也允许你直接在JS中import css文件,并且在bundle中引入这些依赖。

// npm install --save-dev css-loader
// npm install --save-dev ts-loader //在webpack.config.js中配置
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: 'css-loader' },
{ test: /\.ts$/, use: 'ts-loader' }
]
}
}; // 使用内联方式配置
import Styles from 'style-loader!css-loader?modules!./styles.css'; // 通过 CLI 使用
webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'

3.5 插件 plugins

webpack 插件是一个具有 apply属性的 JavaScript 对象,用来解决loader无法实现的其他事。

const HtmlWebpackPlugin = require('html-webpack-plugin'); //通过 npm 安装
const webpack = require('webpack'); //访问内置的插件 module.exports = {
....
plugins: [
new webpack.optimize.UglifyJsPlugin(),
new HtmlWebpackPlugin({template: './src/index.html'})
]
}

4 概念补充

4.1模块 module

在模块化编程中,开发者将程序分解成离散功能块,并称之为模块。

模块以各种方式表达他们的依赖关系:

  • es2015 import 语句
  • commonjs require() 语句
  • AMD define 和 require 语句
  • css/sass/less文件中的 @import 语句
  • 样式url(...)或HTML文件<img src=.../>中的图片链接

4.2 模块解析 module resolution

resolver是一个库,用于帮助找到模块的绝对路径。当打包模块时,webpack使用enhanced-resolve来解析文件路径。

webpack中的解析规则:

// 已经取得文件的绝对路径,不需要在做解析
import "C:\\Users\\me\\file"; // 在import/require给定的相对路径,添加上下文路径,转化为绝对路径
import "../src/file1"; // 模块路径
//(1)指定目录,如果目录具有扩展名,直接打包;如果没有,查看resolve.extensions 的值,看看接受那些扩展名,如.js,.jsx
import "module"; //(2)指向文件夹
/*a.如果文件夹中包含 package.json 文件,则按照顺序查找 resolve.mainFields 配置选项中指定的字段。
并且 package.json 中的第一个这样的字段确定文件路径。
b.如果 package.json 文件不存在或者 package.json 文件中的 main 字段没有返回一个有效路径,则按照顺序查找 resolve.mainFiles 配置选项中指定的文件名,看是否能在 import/require 目录下匹配到一个存在的文件名。
c.文件扩展名通过 resolve.extensions 选项采用类似的方法进行解析。*/
import "module/lib/file";

4.3 Runtime 与 Manifest

在使用webpack构建的应用程序或站点中,有三种主要的代码类型:

(1)你或你的团队编写的代码;

(2)你的源码会依赖的任何第三方的 library 或 vendor 代码;

(3)webpack 的 runtime 和 mainfest,管理所有模块的交互。

当打包之后,应用程序的目录结构不复存在,webpack通过runtime与manifest管理各个模块之间的联系与交互。

manifest保留着所有模块的详细要点(比如依赖于哪个模块),将import或require语句都转化为__webpack_require__方法,指向模块标识符。

runtime根据manifest,查询模块标识符,实现模块的加载和逻辑解析。

4.4 模块热替换 hot module replacement

模块热替换会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面,主要通过以下方式来加快开发速度:

(1)保留在完全重新加载页面时丢失的应用程序状态;

(2)只更新变更的内容;

(3)像在浏览器调试器中更改样式一样快。


待理解之后补充:

(1)模块路径指向文件夹的查找方式;

(2)为何在使用缓存时,有些表面上的内容没有修改,计算出的哈希还是会改变。(文中原因::runtime和manifest的注入在每次构建都会发生变化);

(3)模块热替换的原理。

Webpack 学习记录之概念的更多相关文章

  1. 前段学习 之 webpack 学习记录

    自动化安装 1.安装node (node -v查看node版本) 2.全局安装vue-cli  Npm install -g vue-cli  Vue- v:查看是否安装成功  Vue list:查看 ...

  2. webpack学习记录 - 学习webpack-dev-server(三)

    怎么用最简单的方式搭建一个服务器? 首先安装插件 npm i --save-dev webpack-dev-server 然后修改 packet.json 文件 "scripts" ...

  3. webpack学习记录-认识loader(二)

    Loader 就像是一个翻译员,能把源文件经过转化后输出新的结果,并且一个文件还可以链式的经过多个翻译员翻译. loader参考文章:https://webpack.docschina.org/loa ...

  4. webpack学习记录-初步体验(一)

    一.关于webpack 自从出现模块化以后,大家可以将原本一坨代码分离到个个模块中,但是由此引发了一个问题.每个 JS 文件都需要从服务器去拿,由此会导致加载速度变慢.Webpack 最主要的目的就是 ...

  5. webpack学习记录

    webpack 中文网站  https://webpack.docschina.org/ webpack1 有编译打包 模块热更新 代码分割 文件处理功能 webpack2 tree Shaking( ...

  6. git学习记录——基础概念和文件的基本操作

    夸一下git git是当前世界上最先进的分布式版本控制系统 优势: 1.不必联网 2.Git极其强大的分支管理,把SVN等远远抛在了后面. 集中式的代表CVS和SVN 分布式的代表BitKeeper, ...

  7. webpack学习记录 二

    开发网站 用polyfill(全局污染)  开发框架 用Runtime(局部污染) 在.babelrc文件中

  8. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  9. 【原】webpack学习笔记

    之前在react的项目中有用过webpack,不过没有认真的去研究,这段时间又重新好好的学习一下webpack,发觉 webpack是一个很强大的东西.而且很好用,方便,接下来主要是做一下学习的笔记 ...

随机推荐

  1. JAVA反映机制A

    以下这个URL讲得不错,可以把概念和用途结合起来, 练练手: http://blog.csdn.net/xiaohai798/article/details/11640427 import java. ...

  2. 【ACM】hdu_zs3_1005_String Matching_201308100920

    String Matching Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other)Tota ...

  3. [Angular] Freshness Caching Policy - Network First, Cache Last

    In some cases, you want to get fresh data instead of cache data to the screen, such as stock applica ...

  4. Android Studio Mac 快捷键整理分享

    代码高亮 OSX:Shift + Cmd + F7 Win/Linux:Alt + J 代码高亮向上查找 OSX:Shift + Cmd + G Win/Linux:Shift + F3 代码高亮向下 ...

  5. 使用makeself创建安装文件

    Makeself.sh是一个小的Shell脚本.用于从一个文件夹中生成自解压的tar.gz压缩包. 结果文件以一个shell脚本显示(大多数以.run作为后缀名).能够自己主动执行.该文档会解压自己到 ...

  6. oc20--继承2

    // // Phone.h #import <Foundation/Foundation.h> // 被继承的这个类我们称之为父类/ 超类 @interface Phone : NSObj ...

  7. Swift-理解值类型

    在这里,我们要讲讲值类型和写时复制.在 swift 的标准库中,所有的集合类型都使用了写时复制.我们在本篇文章中看一下写时复制如何工作的,并且如何实现它. 引用类型 使用 swift 的 Data 和 ...

  8. Node.js:REPL(交互式解释器)

    ylbtech-Node.js:REPL(交互式解释器) 1.返回顶部 1. Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器 ...

  9. [计蒜客] tsy's number 解题报告 (莫比乌斯反演+数论分块)

    interlinkage: https://nanti.jisuanke.com/t/38226 description: solution: 显然$\frac{\phi(j^2)}{\phi(j)} ...

  10. 记录,javascript中对象的属性名是字符串,却可以不用引号

    问题描述:今日看书,里面介绍js的对象的属性名是包括空字符串在内的所以字符串 问题来了,我们平时定义的对象如下,是没有引号""or’'的 var someone  = {    f ...