0

0

详解webpack中四个基础概念

零下一度

零下一度

发布时间:2017-06-26 09:46:08

|

2168人浏览过

|

来源于php中文网

原创

前面的话

  webpack是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。当webpack处理应用程序时,它会递归地构建一个依赖关系图表(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成少量的bundle(通常只有一个),由浏览器加载。它是高度可配置的,在开始前需要先理解四个核心概念:入口(entry)、输出(output)、加载器(loader)、插件(plugins)。本文将详细介绍webpack的这四个基础概念

 

入口

  webpack将创建所有应用程序的依赖关系图表。图表的起点被称之为入口起点(entry point)。入口起点告诉 webpack 从哪里开始,并遵循着依赖关系图表知道要打包什么。可以将应用程序的入口起点认为是根上下文或 app 第一个启动文件

  类比于requirejs中的入口文件main.js,最终使用r.js打包时,都打包在main.js里

  在webpack中,使用webpack配置对象中的entry属性来定义入口,包括以下多种方式

【单个入口(简写)语法】

  用法:entry: string|Array

  [注意]在设置entry属性时,如果是当前页面,一定要在属性值前面设置为'./',否则无法识别

//webpack.config.jsvar config = {
  entry: './path/to/my/entry/file.js'};

  entry属性的单个入口语法,是下面的简写:

//webpack.config.jsvar config = {
  entry: {
    main: './path/to/my/entry/file.js'
  }
};

  向entry传入一个数组时,将创建“多个主入口(multi-main entry)”

entry:['./entry1','./entry2']

【对象语法】

  用法:entry: {[entryChunkName: string]: string|Array}

//webpack.config.jsvar config = {
  entry: {
    app: './src/app.js',
    vendors: './src/vendors.js'
  }
};

  对象语法会比较繁琐。然而,这是应用程序中定义入口的最可扩展的方式

  从上面的代码可知,webpack从app.js和vendors.js开始创建依赖图表。这些图表是彼此完全分离、互相独立的。这种方式比较常见于,只有一个入口起点(不包括vendor)的单页应用程序(single page application)中

 

出口

  将所有的资源(assets)归拢在一起后,还需要告诉webpack在哪里打包应用程序。webpack的output属性描述了如何处理归拢在一起的代码(bundled code)

//webpack.config.jsvar path = require('path');
module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  }
};

  在上面的代码中,我们通过output.filename和output.path属性,来告诉webpack bundle的名称,以及我们想要生成(emit)到哪里

  [注意]即使可以存在多个入口起点,但只指定一个输出配置,如下所示output的filename必须为[name]或其类似,不能为确定的名称,否则会提示Conflict: Multiple assets emit to the same filename bundle.js,翻译过来是多入口不能指定出口文件中同样的filename名称

  entry: {'main': './entry.js','hello':'./hello.js'
  },
  output: {
    path: __dirname,//出口路径filename: '[name].js'//出口名称
  }

 

【用法(Usage)】

  在webpack中配置output属性,需要将它的值设置为一个对象,并包含filename和path属性这两个必选项

  filename:编译文件的文件名,首选推荐://main.js||bundle.js||index.js

  path:对应一个绝对路径,此路径是希望一次性打包的目录

 config ='bundle.js''/home/proj/public/assets'

【选项(Options)】

output.chunkFilename

  非入口的chunk(non-entry chunk)的文件名,路径相对于output.path目录

[id] 被chunk的id替换
[name] 被chunk的name替换(或者,在chunk没有name时使用id替换)
[hash] 被compilation生命周期的hash替换
[chunkhash] 被chunk的hash替换

output.crossOriginLoading

  此选项可以启用跨域加载(cross-origin loading)chunk,可选的值有:

false - 禁用跨域加载(默认值)"anonymous" - 启用跨域加载。当使用 anonymous 时,发送不带凭据(credential)的请求。"use-credentials" - 启用跨域加载。发送带凭据(credential)的请求

output.devtoolLineToLine

  所有/指定模块启用行到行映射(line-to-line mapped)模式。行到行映射模式使用一个简单的SourceMap,即生成资源(generated source)的每一行都映射到原始资源(original source)的同一行。这是一个可做性能优化之处。当需要更好的性能,并且只要确保输入行(input line)和生成行(generated line)匹配时,才会考虑启用

true 在所有模块启用(不推荐)
{test, include, exclude} 对象,对特定文件启用(类似于 module.loaders)
默认值:
false

output.filename

  指定硬盘每个输出文件的名称。在这里不能指定为绝对路径。output.path选项规定了文件被写入硬盘的位置。filename仅用于命名每个文件

//单个入口{
  entry: './src/app.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/build'
  }
}
//多个入口{
  entry: {
    app: './src/app.js',
    search: './src/search.js'
  },
  output: {
    filename: '[name].js',//被 chunk 的 name 替换path: __dirname + '/build'
  }
}

output.hotUpdateChunkFilename

  热更新chunk(Hot Update Chunk)的文件名。它们在output.path目录中

[id] 被chunk的id替换
[hash] 被compilation生命周期的hash替换。(最后一个hash存储在记录中)
默认值:"[id].[hash].hot-update.js?1.1.11"

output.hotUpdateFunction

  webpack中用于异步加载(async load)热更新(hot update)chunk的JSONP函数

默认值:"webpackHotUpdate"

output.hotUpdateMainFilename

  热更新主文件(hot update main file)的文件名

[hash] 被compilation生命周期的hash替换。(最后一个hash存储在记录中)
默认值:"[hash].hot-update.json"

output.jsonpFunction

  webpack中用于异步加载(async loading)chunk的JSONP函数

  较短的函数可能会减少文件大小。当单页有多个webpack实例时,请使用不同的标识符(identifier)

默认值:"webpackJsonp"

output.library

  如果设置此选项,会将bundle导出为library。output.library是library的名称。

  如果正在编写library,并且需要将其发布为单独的文件,请使用此选项

output.libraryTarget

  library的导出格式

"var" - 导出为一个变量: Library ="this" - 导出为  的一个属性:["Library"] ="commonjs" - 导出为 exports 的一个属性:exports["Library"] ="commonjs2" - 通过 module.exports:module.exports ="amd" - 导出为 AMD(可选命名 -"umd" -

  如果output.library未设置,但是output.libraryTarget被设置为var以外的值,则「所导出对象」的每个属性都被复制到「对应的被导出对象」上(除了amd,commonjs2和umd)

output.publicPath

逻辑智能
逻辑智能

InsiderX:打造每个团队都能轻松定制的智能体员工

下载

  一般地,publicPath用于设置上线地址,在开发过程中,该值不需要设置

output: {
    filename:'main.js'path: "/home/proj/public/assets",
    publicPath: "http://cdn.com"}

  以上面代码为例,最终main.js的线上地址是'http://cdn.com/home/proj/public/assets/main.js'

output.path

  导出目录为绝对路径(必选项)

//config.jsoutput: {
    path: "/home/proj/public/assets",
    publicPath: "/assets/"}//index.html
  
//config.jsoutput: {
    path: "/home/proj/cdn/assets/[hash]",
    publicPath: "http://cdn.example.com/assets/[hash]/"}

  [注意]在编译时不知道最终输出文件的 publicPath 的情况下,publicPath 可以留空,并且在入口起点文件运行时动态设置。如果你在编译时不知道 publicPath,你可以先忽略它,并且在入口起点设置 __webpack_public_path__

 __webpack_public_path__ = myRuntimePublicPath

output.sourceMapFilename

  JavaScript 文件的 SourceMap 的文件名

[file] 被 JavaScript 文件的文件名替换
默认值:"[file].map"

 

加载器

  webpack的目标是,让webpack聚焦于项目中的所有资源(asset),而浏览器不需要关注考虑这些。webpack把每个文件(.css,.html,.scss,.jpg,etc.)都作为模块处理。然而webpack只理解JavaScript。webpack loader会将这些文件转换为模块,而转换后的文件会被添加到依赖图表中

  loader可以使你在require()或"加载"模块时预处理文件。因此,loader类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法

  webpack的配置要能识别出(identify)应该被对应的loader进行转换(transform)的那些文件。由于进行过文件转换,所以能够将被转换的文件添加到依赖图表(并且最终添加到bundle中)(use属性)

var path = require('path');var config = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      {test: /\.(js|jsx)$/, use: 'babel-loader'}
    ]
  }
};
module.exports = config;

  以上配置中,对一个单独的module对象定义了rules属性,里面包含两个必须属性:test和use。相当于告诉webpack compiler,碰到「在require()/import语句中被解析为'.js'或'.jsx'的路径」时,在把它们添加并打包之前,要先使用babel-loader去转换”

  [注意]在webpack配置中定义loader时,要定义在module.rules中,而不是rules。在定义错误时webpack会给出严重的警告

【示例】

  例如,使用loader加载CSS文件,或将TypeScript转为JavaScript。首先,安装对应的loader:

npm install --save-dev css-loader
npm install --save-dev ts-loader

  其次,配置webpack.config.js,对每个.css文件使用css-loader,然后类似地,对每个.ts文件使用ts-loader:

//webpack.config.jsmodule.exports = {
  module: {
    rules: [
      {test: /\.css$/, use: 'css-loader'},
      {test: /\.ts$/, use: 'ts-loader'}
    ]
  }
};

  [注意]根据配置选项,下面的规范定义了同等的loader用法:

{test: /\.css$/, loader: 'css-loader'}// 等同于{test: /\.css$/, use: 'css-loader'}// 等同于{test: /\.css$/, use: {
  loader: 'css-loader',
  options: {}
}}

【配置】

  在应用程序中,有三种使用 loader 的方式:1、通过配置;2、在 require 语句中显示使用;3、通过 CLI

通过配置

  module.rules允许在webpack配置中指定几个loader。 这是展示loader的一种简明的方式,并且有助于使代码变得简洁。而且对每个相应的loader有一个完整的概述

module: {
  rules: [
    {
      test: /\.css$/,
      use: [
        { loader: 'style-loader'},
        {
          loader: 'css-loader',
          options: {
            modules: true  }
        }
      ]
    }
  ]
}

通过require

  可以在require语句(或define,require.ensure,等语句)中指定loader。使用!将资源中的loader分开。分开的每个部分都相对于当前目录解析

require('style-loader!css-loader?modules!./styles.css');

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

  选项可以传递查询参数,就像在web中那样(?key=value&foo=bar)。也可以使用JSON对象(?{"key":"value","foo":"bar"})

通过CLI

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

  这会对 .jade 文件使用 jade-loader,对 .css 文件使用 style-loader 和 css-loader

【特性】

  loader 支持链式传递。能够对资源使用流水线(pipeline)。loader 链式地按照先后顺序进行编译。loader 链中的第一个 loader 返回值给下一个 loader。在最后一个 loader,返回 webpack 所预期的 JavaScript

  loader 可以是同步或异步函数。loader 运行在 Node.js 中,并且能够执行任何可能的操作

  loader 接收查询参数。用于 loader 间传递配置。loader 也能够使用 options 对象进行配置

  除了使用 package.json 常见的 main 属性,还可以将普通的 npm 模块导出为 loader,做法是在 package.json 里定义一个 loader 字段

  插件(plugin)可以为 loader 带来更多特性。loader 能够产生额外的任意文件。

  loader 通过(loader)预处理函数,为 JavaScript 生态系统提供了更多有力功能。用户现在可以更加灵活的引入细粒度逻辑,例如压缩(compression)、打包(package)、语言翻译(language translation)和其他更多

【解析】

  loader 遵循标准的模块解析。多数情况下,loader 将从模块路径(通常将模块路径认为是 npm install, node_modules)解析。

  loader 模块需要导出为一个函数,并且使用 Node.js 兼容的 JavaScript 编写。在通常情况下,可以使用 npm 来管理 loader,也可以将 loader 模块作为应用程序中的文件。按照约定,loader 通常被命名为 xxx-loader(例如 json-loader)

 

插件

  插件是wepback的支柱功能。在使用webpack配置时,webpack自身也构建于同样的插件系统上。插件目的在于解决loader无法实现的其他事情。由于loader仅在每个文件的基础上执行转换,而插件(plugins)最常用于(但不限于)在打包模块的“compilation”和“chunk”生命周期执行操作和自定义功能。webpack的插件系统极其强大和可定制化。

  想要使用一个插件,只需要require()它,然后把它添加到plugins数组中。多数插件可以通过选项(option)自定义。也可以在一个配置文件中因为不同目的而多次使用同一个插件,需要使用new创建实例来调用它

【剖析】

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

//ConsoleLogOnBuildWebpackPlugin.jsfunction ConsoleLogOnBuildWebpackPlugin() {

};
ConsoleLogOnBuildWebpackPlugin.prototype.apply = function(compiler) {
  compiler.plugin('run', function(compiler, callback) {
    console.log("webpack 构建过程开始!!!");

    callback();
  });
};

【用法】

  由于plugin可以携带参数/选项,必须在wepback配置中,向plugins属性传入new实例

var HtmlWebpackPlugin = require('html-webpack-plugin'); //通过 npm 安装var webpack = require('webpack'); //访问内置的插件var path = require('path');var config = {
  entry: './path/to/my/entry/file.js',
  output: {
    filename: 'my-first-webpack.bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    loaders: [
      {
        test: /\.(js|jsx)$/,
        loader: 'babel-loader'  }
    ]
  },
  plugins: [new webpack.optimize.UglifyJsPlugin(),new HtmlWebpackPlugin({template: './src/index.html'})
  ]
};
module.exports = config;

 

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

27

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

15

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

3

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

13

2026.02.03

Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

114

2026.02.03

Java 设计模式与重构实践
Java 设计模式与重构实践

本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

3

2026.02.03

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2

2026.02.03

Python 强化学习与深度Q网络(DQN)
Python 强化学习与深度Q网络(DQN)

本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

3

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.5万人学习

两小时学会 Webpack
两小时学会 Webpack

共14课时 | 1.7万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号