webpack学习之路—入门篇

1、什么是webpack?

首先是webpack对自己阐述:本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
本人的理解:webpack说白了就是一款静态资源打包工具,运用模块化的理念对程序进行打包编译,并且这样的打包是可以高度自定义,用户可以通过配置在打包的过程中对项目资源作各种处理,其目的是更有利于浏览器运行处理。

2、webpack的安装

Wabpack的安装部分往往容易被人忽略但其实这也是相当重要的一部分。
首先webpack有全局安装也有局部安装
全局安装
npm i webpack -g
全局安装会把webpack安装在某个全局环境下,全局安装在命令行中的任何地方都是可以直接调用的。
局部安装
npm i webpack
npm i webpack --save
npm i webpack --save-dev
–save:将保存配置信息到pacjage.json的dependencies节点中。
–save-dev:将保存配置信息到pacjage.json的devDependencies节点中。
dependencies:运行时的依赖,发布后,即生产环境下还需要用的模块
devDependencies:开发时的依赖。里面的模块是开发时用的,发布时用不到它。
webpack安装注意事项
由于webpack现版本已经更新到webpack4了,当安装最新版本时有可能会出现一些问题
在webpack3中,webpack本身和它的CLI是在同一个包中的,但是在第4版中,他们已经将两者分开来了,这样会导致原来的命令用不了的情况,而这时命令行会提示你安装webpack-cli,安装上webpack-cli就行了。
提示如下:
在这里插入图片描述

3、webpack的核心

入口(entry): entry会告诉webpack,它应该从哪里入手处理你的项目,入口文件里应当包含你项目的各种依赖关系,只有这样webpack才能顺藤摸瓜分析清楚你项目的结构,当然入口文件可以是一个也可以是多个,只有一个入口文件或者是使用数组传入几个入口文件,在没有使用一些抽离插件的情况下,webpack会一股脑地把所有的依赖文件(包括css)打包成一个js文件,而使用对象传入多入口文件的情况下webpack则会根据入口文件数量打包出多个js文件。
入口配置项:

类型 例子 含义
String "./app/entry.js" 入口模块的文件路径,可以是相对路径
Array ['./app/entry1.js','./app/entry2.js'] 入口模块的文件路径,可以是相对路径
Object {a:'./app/entry1.js',b:'./app/entry2.js'} 配置多个入口,每个入口生成一个chunk

输出(output): 输出指的就是webpack打包出来的文件了,在输出里可以配置文件的命名以及输出路径
filename可选变量:

类型 含义
id Chunk的唯一标识,从0开始
name `Chunk的名称
hash Chunk的唯一标识的hash值
chunkhash Chunk内容的hash值

加载器(loader):webpack本身只会处理js文件,而一个项目中往往会有各种不同类型的文件,这些不同类型的文件想要让webpack来识别就必须使用loader,并配置loader,以此来告诉weback通过怎样的规则去识别处理非js文件。当然了,js文件也可以通过loader来处理,webpack社区也会有一些处理js的插件,如babel-loader,它可以将js的一些ES6的语法转换成大多数浏览器可以识别运行的语法。
插件(plugins):webpack之所以强大,很大一部分原因就是它拥有数量极多功能极丰富的插件,通过这些插件webpack几乎无所不能。

4、实例配置

前面说了这么多,来个实际操作吧
webpack.config.js.

// webpack.config.js
var webpack = require('webpack')
path = require('path')
ExtractTextPlugin = require("extract-text-webpack-plugin")
HtmlWebpackPlugin = require('html-webpack-plugin')
CopyWebpackPlugin = require('copy-webpack-plugin')


module.exports = {
	mode: 'development',
	devtool: 'inline-source-map',
	context: __dirname,
	// 入口文件
	entry: {
		app: './src/js/index.js' 
	},
	// 输出
	output: {
		path: path.resolve(__dirname, 'dist'),
		filename: 'js/[name]-[hash].js',
	},
	// 模块
	module: {
		rules: [
			// 处理图片文件loader配置
			{
				test: /.(jpg|png|gif|svg)$/,
				use: [
					{
						loader: 'file-loader',
						options: {
							name: 'images/[name].[hash:7].[ext]',
							publicPath: '../',
							outputPath: '/'
						}
					}
				]
			},
			// CSS文件处理,使用了抽离插件
			{
				test: /\.css$/,
				use: ExtractTextPlugin.extract(['css-loader', 'postcss-loader'])
			},
		]
	},
	plugins: [
		// 生成html文件,并把打包出来的资源插入html,使用预先编写好的index.html作为模板
		new HtmlWebpackPlugin({
			filename: 'index.html',
			template: './src/index.html'
		}),
		//抽离出来的CSS输出配置
		new ExtractTextPlugin('css/[name].[hash:8].css'),
		//对于字体文件,本人使用直接copy过去的插件
		new CopyWebpackPlugin([
			{
				from: './src/iconfont',
				to: 'iconfont'
			}
		])
	],
	resolve: {
		alias: {
			'old-module': 'new-module'
		}
	},
	// devServer配置
	devServer: {
		https: false,
		host: 'localhost',
		port: 8080,
		contentBase: path.resolve(__dirname, ''),
		stats: "errors-only",
		index: './src/index.html',
		open: true,
		openPage: './src/index.html',
		overlay: {
			errors: true,
			warnings: true
		},
	}
}

源文件结构
在这里插入图片描述
生成dist结构
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_41627898/article/details/83473714
今日推荐