终终终终于下定决心,对你下手了,系统的学习一下。

webpack是一个应用程序的静态模块打包器(module bundler)。处理应用程序时,会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle

入口(entry)

指示应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出入口起点直接和间接依赖的 模块和库。

webpack.config.js

// 单个入口
module.exports = {
entry: {
main: './main.js'
}
}; // 单个入口 简写语法
module.exports = {
entry: './main.js'
}; // 多页面应用程序,
module.exports = {
entry: { // 告诉 webpack 需要 3 个独立分离的依赖图
pageOne: './src/pageOne/index.js',
pageTwo: './src/pageTwo/index.js',
pageThree: './src/pageThree/index.js'
}
};

在多页应用中,每当页面跳转时服务器将获取一个新的 HTML 文档。页面重新加载新文档,并且资源被重新下载。每个 HTML 文档只使用一个入口起点。

出口(output)

可以控制 webpack 如何向硬盘写入编译文件。输出webpack所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。即使可以存在多个入口起点,但只指定一个输出配置。基本上,整个应用程序结构,都会被编译到指定的输出路径的文件夹中。

const path = require('path');

module.exports = {
// ...
output: {
path: path.resolve(__dirname, 'dist'), // 目标输出目录的绝对路径。
filename: 'my-first-webpack.bundle.js' // 输出文件的文件名。
}
};

多入口起点

如果配置创建了多个单独的 "chunk"(例如,使用多个入口起点或使用像 CommonsChunkPlugin 这样的插件),则应该使用占位符来确保每个文件具有唯一的名称。

{
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
} // 写入到硬盘:./dist/app.js, ./dist/search.js

加载器 Loaders

处理非 JavaScript 文件(webpack 自身只理解 JavaScript)。将所有类型的文件转换为 webpack 能够处理的有效模块,然后就可以利用 webpack 的打包能力,对它们进行处理。

本质上,webpack loader 将所有类型的文件转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块,能够 import 导入任何类型的模块(例如 .css 文件),是 webpack 特有的功能。

loader 支持链式传递。能够对资源使用流水线。一组链式的 loader 将按照相反的顺序执行。

有三种使用 loader 的方式:

  • 一、配置(推荐):在 webpack.config.js 文件中指定 loader。
  • 二、内联:在每个 import 语句中显式指定 loader。
  • 三、CLI:在 shell 命令中指定它们。

一、webpack 配置中定义 loader 时,要定义在 module.rules

  1. test 属性:标识需要 loader 转换的某个或某些文件。
  2. use 属性:转换时使用的 loader。
module.exports = {
// ...
module: {
rules: [
{
test: /\.less/, // require()/import 解析路径为 '.less' 时,打包之前,先使用下方loader转换一下
use: ["style-loader", "css-loader", "less-loader"],
}
]
}
};

二、内联

可以在 import 语句或任何等效于 "import" 的方式中指定 loader。使用 ! 将资源中的 loader 分开。分开的每个部分都相对于当前目录解析。

import Styles from 'style-loader!css-loader?modules!./styles.css';

通过前置所有规则及使用 !,可以对应覆盖到配置中的任意 loader。

尽可能使用 module.rules,因为这样可以减少源码中的代码量,并且可以在出错时,更快地调试和定位 loader 中的问题。

三、CLI

.jade 文件使用 jade-loader,对 .css 文件使用 style-loadercss-loader

webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'

插件 Plugins

插件可以用于执行范围更广的任务。包括:打包优化、压缩、重新定义环境中的变量。通过 require()使用一个插件,然后把它添加到 plugins 数组中。多数插件可以自定义选项(option)。可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建它的一个实例。

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件 module.exports = {
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
new webpack.optimize.UglifyJsPlugin(),
new HtmlWebpackPlugin({template: './src/index.html'})
]
};

webpack 插件是一个具有 apply 属性的 JavaScript 对象。apply 属性会被 webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问。

ConsoleLogOnBuildWebpackPlugin.js

const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
apply(compiler) {
compiler.hooks.run.tap(pluginName, compilation => {
console.log("webpack 构建过程开始!");
});
}
}

compiler hook 的 tap 方法的第一个参数,应该是驼峰式命名的插件名称。建议为此使用一个常量,以便它可以在所有 hook 中复用。

模式

通过选择 developmentproduction 之中的一个,来设置 mode 参数,可以启用相应模式下的 webpack 内置的优化

module.exports = {
mode: 'production'
};

或者从CLI 参数中传递:

webpack --mode=production

webpack.config.js 配置

  • 通过 require(...) 导入其他文件
  • 通过 require(...) 使用 npm 的工具函数
  • 使用 JavaScript 控制流表达式,例如 ?: 操作符
  • 对常用值使用常量或变量
  • 编写并执行函数来生成部分配置
  • 调用 webpack 两次应该产生同样的输出文件
  • 编写很长的配置时,应该将配置拆分为多个文件

webpack4.15.1 学习笔记(一) — 基本概念的更多相关文章

  1. 《Think Python》第15章学习笔记

    目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...

  2. JavaScript:学习笔记(2)——基本概念与数据类型

    JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...

  3. OpenFlow Switch学习笔记(一)——基础概念

    OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...

  4. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  5. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  6. 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”

    2015.03.17,外语,读书笔记-<Word Power Made Easy> 01 “如何讨论人格特点”学习笔记 SESSIONS 1 本来这些章节都是在一两年前学习的,现在趁给友人 ...

  7. (1)《Head First HTML与CSS》学习笔记---HTML基本概念

    前言: 1.     这本书并没有面面俱到,涵盖所有内容,只提供作为初学者真正需要的东西:基本知识和信心.所以这不是唯一的参考书.(我买了一本<HTML5权威指南>作为参考书和这本一起看, ...

  8. 自然语言处理NLP学习笔记一:概念与模型初探

    前言 先来看一些demo,来一些直观的了解. 自然语言处理: 可以做中文分词,词性分析,文本摘要等,为后面的知识图谱做准备. http://xiaosi.trs.cn/demo/rs/demo 知识图 ...

  9. hbase 学习笔记一---基本概念

          说在前面,本文部分内容来源于社区官网经过适度翻译,部分根据经验总结,部分是抄袭网络博文,(不一一列举引用,在此致歉)一并列在一起,本文的目的,希望能总结出一些有用的,应该注意到的东西,基本 ...

  10. Elasticserach学习笔记-01基础概念

    本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/e ...

随机推荐

  1. 整理C语言预处理过程语法的实用方法与技巧

    预处理 目录 预处理 一.宏定义 数值宏常量 字符串宏常量 用define宏定义注释符号? 程序的编译过程 预处理中宏替换和去注释谁先谁后? 如何写一个不会出现问题的宏函数 do-while-zero ...

  2. Oracle批量插入和更新

    一.驱动.使用Oracle.ManagedDataAccess.Client 二.原理.利用OracleCommand的ArrayBindCount属性设置批量大小. 三.实现 函数使用的实体是efc ...

  3. sql 常用手册

    根据code 分组然后取出每组中的任意一行 SELECT *from( SELECT *, row_number () OVER ( partition BY code ORDER BY code D ...

  4. aardio桌面软件开发 简单,打包后文件小,支持 .net python 和 众多插件

    aardio 编程语言 - 官网 aardio  专注于桌面软件开发,17年一直保持非常活跃地更新( 更新日志 ),aardio 被多年用于生产项目实践,久经测试和锤炼.aardio 在诞生之初就设计 ...

  5. nginx37条优化

    nginx优化: 1. cpu:核心配置 方法1: worker_processes auto; 自动调用[推荐] 方法2: worker_processes 4; 手工配置 检查CPU核心:yum ...

  6. 8.10考试总结(NOIP模拟35)[玩游戏·排列·最短路·矩形]

    所谓人,无论是谁到了最后,都会形单影只. T1 玩游戏 解题思路 可以把序列从 k 位置掰成两个序列. 问题就变成了两个序列从开头走向末尾是否可以保证前缀和之和一直不大于 0 . 并且可以移动到两个序 ...

  7. 从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“

    本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...

  8. kettle从入门到精通 第三十二课 mysql 数据连接集群/分区配置

    1.这里的集群实际上是数据分区或者分片的概念,如中国全国的学生,应该不会都存在一张表里面,有可能每个省市一个表进行存储. 2.集群(分区),如下图所示 设置在"集群"标签,勾选&q ...

  9. redis自动化安装

    1.ruby脚本自动化安装 1.安装ruby开发环境 yum install rubygems -y 2.通过ruby包管理工具,安装操作redis的模块 gem sources --remove h ...

  10. Java中PDF的转换(图片)与展示

    解决的问题 有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好. 那么怎 ...