webpack 从入门到放弃

本贴最后更新于 1645 天前,其中的信息可能已经事过境迁

Webpack 是一个前端的静态模块资源打包工具,能让浏览器也支持模块化。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

常用命令

webpack -v 查看版本号
webpack ./js/main.js -o ./js/bundle.js 第一个路径为入口js的路径,第二个路径参数为生成文件的路径

使用配置文件之后,直接使用 webpack 命令,不需要参数也可以打包,配置文件的名字为“webpack.config.js”。
下面是一个完整配置的内容:

// 引用 Node.js 中的 path 模块,处理文件路径的小工具
const path = require("path");
// 1. 导出一个webpack具有特殊属性配置的对象
module.exports = {
	// 指定模式配置,取值: none(什么也没有), development or production(默认的),不写的话会出现黄色警告
	// 如, production 模式打包后 bundle.js是压缩版本的, development则不是压缩的
	mode: 'none',
	// 入口
	entry: './src/main.js', // 入口模块文件路径
	// 出口是对象
	output: {
		// path 必须是一个绝对路径 , __dirname 是当前js的绝对路径:D: \StudentProject\ WebStudy\ webpack - demo2
		path: path.join(__dirname, './dist/'), // 打包的结果文件存储目录
		filename: 'bundle.js' // 打包的结果文件名
	}
}

webpack 应该作为本地安装,并且只需要存在于开发环境中,所以需要安装到开发环境依赖:

npm init -y 初始化项目
npm install webpack@v4.35.2 -D 把webpack安装到项目的开发环境依赖
npm install webpack-cli@3.3.6 -D  V4+版本的webpack需要安装cli

然后在 package.json 中添加映射:

	"scripts": {
		"show": "webpack -v",
		"start": "node ./src/main.js",
		"build": "webpack"
	}

完整的 package.json 配置:

{
	"name": "webpack3",
	"version": "1.0.0",
	"description": "",
	"main": "webpack.config.js",
	"scripts": {
		"test": "echo \"Error: no test specified\" && exit 1",
		"show": "webpack -v",
		"start": "node ./src/main.js",
		"build": "webpack"
	},
	"keywords": [],
	"author": "",
	"license": "ISC",
	"devDependencies": {
		"webpack": "^4.35.2",
		"webpack-cli": "^3.3.6"
	}
}

查看 webpack 版本号:npm run show
运行 main.js 模块:npm run start,如果命令映射的别名是 start ,可省略 run 进行简写执行,即:npm start
打包构建:npm run build

打包完成后,在 html 中引入打包生成的 bundle.js 文件,浏览器就可以正常识别了。

webpack 除了用来打包 js,还可以用来打包其他资源文件,比如 css,图片。

  • 打包 css 资源

    1. 安装打包相关的工具插件:npm install --save-dev style-loader css-loader,css-loader 是将 css 装载到 javascript,style-loader 是让 javascript 认识 css。
    2. 在 webpack.config.js 中新增以下配置:
    module: { // 模块
    	rules: [ // 规则
    		{
    			test: /\.css$/, // 正则表达式,匹配 .css 文件资源
    			use: [ // 使用的 Loader ,注意顺序不能错
    				'style-loader',
    				'css-loader'
    			]
    		}
    	]
    }
    

    整个 webpack.config.js 中的配置内容如下:

    // 引用 Node.js 中的 path 模块,处理文件路径的小工具
    const path = require("path");
    // 1. 导出一个webpack具有特殊属性配置的对象
    module.exports = {
    	// 指定模式配置,取值: none(什么也没有), development or production(默认的)
    	// 如, production 模式打包后 bundle.js是压缩版本的, development则不是压缩的
    	mode: 'none',
    	// 入口
    	entry: './src/main.js', // 入口模块文件路径
    	// 出口是对象
    	output: {
    		// path 必须是一个绝对路径 , __dirname 是当前js的绝对路径:D: \StudentProject\ WebStudy\ webpack - demo2
    		path: path.join(__dirname, './dist/'), // 打包的结果文件存储目录
    		filename: 'bundle.js' // 打包的结果文件名
    	},
    
    	module: { // 模块
    		rules: [ // 规则
    			{
    				test: /\.css$/, // 正则表达式,匹配 .css 文件资源
    				use: [ // 使用的 Loader ,注意顺序不能错
    					'style-loader',
    					'css-loader'
    				]
    			}
    		]
    	}
    }
    
    

    3.在 src 目录下新建一个 style.css 文件,内容如下:

    body {
    	background: red
    }
    
    

    4.在 main.js 中引入 style.css 文件

    // 模块方式导入 css , 最终会打包成js,打包在 bundle.js 中
    import './css/style.css'
    

    5.打包编译

    npm run build
    

    最后打开 html 文件,就可以看见 css 已经生效了。

  • 打包图片资源
    1.安装相关工具

    npm install --save-dev file-loader
    

    2.修改 webpack.config.js 文件配置,内容如下:

    // 引用 Node.js 中的 path 模块,处理文件路径的小工具
    const path = require("path");
    // 1. 导出一个webpack具有特殊属性配置的对象
    module.exports = {
    	// 指定模式配置,取值: none(什么也没有), development or production(默认的)
    	// 如, production 模式打包后 bundle.js是压缩版本的, development则不是压缩的
    	mode: 'none',
    	// 入口
    	entry: './src/main.js', // 入口模块文件路径
    	// 出口是对象
    	output: {
    		// path 必须是一个绝对路径 , __dirname 是当前js的绝对路径:D: \StudentProject\ WebStudy\ webpack - demo2
    		path: path.join(__dirname, './dist/'), // 打包的结果文件存储目录
    		filename: 'bundle.js' // 打包的结果文件名
    	},
    
    	module: { // 模块
    		rules: [ // 规则
    			{
    				test: /\.css$/, // 正则表达式,匹配 .css 文件资源
    				use: [ // 使用的 Loader ,注意顺序不能错
    					'style-loader',
    					'css-loader'
    				]
    			},
    			{
    				test: /\.(png|svg|jpg|gif)$/,
    				use: [
    					'file-loader',
    				]
    			}
    		]
    	}
    }
    
    

    3.修改 style.css,内容如下:

    body {
    	background: red;
    	background-image: url(./1.jpg)
    }	
    

    4.打包编译

    npm run build
    

    5.如果直接访问根目录下的 index.html,那么图片资源路径就无法访问到。
    解决方案:就是把 index.html 放到 dist 目录中。
    但是 dist 是打包编译的结果,而非源码,所以把 index.html 放到 dist 就不合适。
    而且如果我们一旦把打包的结果文件名 bundle.js 改了之后,则 index.html 也要手动修改。
    综合以上遇到的问题,可以使用一个插件: html-webpack-plugin 来解决。

  • 使用 HtmlWebpackPlugin 插件
    作用:解决文件路径问题
    将 index.html 打包到 bundle.js 所在目录中
    同时也会在 index.html 中自动的

  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 295 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 513 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 42 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 108 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 2 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 8 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 194 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • OnlyOffice
    4 引用 • 23 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 462 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 421 回帖
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 609 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 598 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    40 引用 • 24 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 443 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 559 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 626 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 20 关注