webpack4---模块化打包工具(一)

2023-11-03

一、webpack4初识

1.首先先了解几个规范

   ES规范,导出:export default Header;

                  导入:import Header from ‘./header.js’;

CommonJS规范,导出:module.exports = Header;

                             导入:var header = require('./header.js');

其他规范CMD,AMD

2.给出一个小的项目

如果该项目不用webpack打包根本并不会正确运行,因为浏览器并不会识别导入导出的js语法,但是webpack可识别这些语法

首先 npm init 初识化项目,然后npm install webpack webpack-cli -D/--save-dev 进行安装webpack

将index.js文件打包,npx webpack index.js

这时候在导入生成的dist目录下的main.js即可正常运行项目

但是就会有人说了,那webpack不就是js的翻译器么,这样说其实是夸大了他的功能,因为他只能识别很少部分js

二、webpack的安装

1.全局安装:npm install webpack webpack-cli -g

    缺点:一旦全局安装,如果一个项目webpack3,一个项目webpack4 有一个项目就跑不起来了

  在项目中安装npm install webpack webpack-cli -D/--save-dev

2.小点补充:(1)npm info webpack 可以车看webpack中所有的版本

                     (2)npm install webpack@xxxxx webpack-cli -D版本号安装

                     (3)一般github的项目中都没有node_moudle文件,想让项目跑起来,在项目中执行命令 npm install  即可

三、简单利用webpack配置文件

配置文件webpack.config.js和package.js文件的配置和修改,以及目录结构的变化

修改了package.js中的scripts中的启动命令后就不用npx webpack 了用npm run boundle 即可

 补充,上边的入口配置实际是简写,写全是main:xxx,然后模式默认为mode:production (js文件压缩形式) mode:development(js不压缩)

四、file-loader(可用于图片打包) url-loader

url-loader的使用和file-loader类似,特别之处在于:url-loader如果未超过限定的大小,回打包到js文件中,这样一个小的图片文件就不会在发送一次http请求了;如果超过了限定大小,会打包到image文件夹下,这样不会使js文件过大,不会导致页面出现一大段时间的空白。

webpack.config.js文件

module:{
		rules:[{
			test:/\.(png|jpg|gif)$/,
			use:{
				loader:'file-loader',
				options:{
					name:'[name]_[hash].[ext]',
					outputPath:'images/'
				}
			}
		}]
	},
module:{
		rules:[{
			test:/\.(png|jpg|gif)$/,
			use:{
				loader:'url-loader',
				options:{
					name:'[name].[ext]',
					outputPath:'images/',
					limit:2048
				}
			}
		}]
	},

这里的2048是2kb

五、css-loader等等样式打包

1.先介绍简单的css打包

npm install style-loader css-loader -D

 

2.接下来介绍一下更高级一点的,比如sass、less等等

npm install sass-loader node-sass --save-dev

 

{
    test:/\.scss$/,
    use:['style-loader','css-loader','sass-loader']
}

3.对于一些css3新特性的使用(加前缀,-webkit-    -moz-):

npm install -D postcss-loader

但还有引用第三方的插件

npm install autoprefixer -D

然后根据官方文档进行配置

//新建一个postcss.config.js配置文件,内容如下

module.exports = {
  plugins: [
  	require('autoprefixer')
  ]
}



//webpack.config.js

{
    test:/\.scss$/,
    use:[   'style-loader',
	    'css-loader',
	    'sass-loader',
	    'postcss-loader'
	]
}

其实这些loader是有顺序的,从下向上,从右向左,先是执行postcss,然后找是否是sass,接着将scss转成css最后style挂在到页面上

4.若在sass文件中有引入了sass文件,如果像上边那样配置的话,引入的那个sass文件就不会被翻译过来了,因为不会走下边的sass-loader和postcss-loader这两个loader了,直接走css-loader,如果新配置了importLoader: 2 这个意思是,不管js引入的sass文件,还是sass文件中引入的sass文件都会从下往上走进行编译

5.只在一个作用域内使css生效,模块化css,配置:modules:true注意引入时要给css文件加一个名字,并且引入其中的类名时要用  名字.类名

5. 关于图标字体的使用

图标的引入时利用了iconfont阿里图标库,如果第一次接触的话可有百度一下

将下载下来的css文件引入自己需要的位置并注意除了base64以外都需要修改字体路径,在这里就相当于了svg、woff文件的引入,所以不用在import了,进行配置webpack.config.js

module:{
	rules:[{
		test:/\.(png|jpg|gif)$/,
		use:{
			loader:'url-loader'
		}
	}]
}

六、关于html-webpack-plugin、clean-webpack-plugin的使用

1.html-webpack-plugin 安装这个插件后将在打包目录里自动生成index.html并将想打包的js引入进js中

npm install --save-dev html-webpack-plugin

关于配置,最常用的参数是template,以一个html文件为模板来生成打包目录的html

var HtmlWebpackPlugin = require('html-webpack-plugin');

plugins: [
	new HtmlWebpackPlugin({
		template: 'src/index.html'
	})
]

2.clean-webpack-plugin

npm install --save-dev clean-webpack-plugin

每次打包都清除之前的dist打包目录,就不用手动删除上一次遗留下来的东西了,同上边的配置和引入,注意自己调整一下参数即可,注意这个的引入有点特殊。要用const { CleanWebpackPlugin } = require(‘clean-webpack-plugin’),要加一个大括号

综上,其实plugin就相当于vue中的生命周期钩子,在打包的不同节点自己自动执行。

七、关于source-map

他其实是一个映射关系,默认情况下他是devtool:‘none’是关闭的,即当我们的某些代码写错时,打包的git不会报错,但是控制台会报错,不配置的话他报错的位置是打包后文件的位置,根本找不到在原来的那个文件有代码错误,配置后便能很好的映射到原来的文件位置,查到后便可修改了。

module.exports = {
	mode:'production',
	devtool:'source-map'
} 

还有inline-source-map等等等,自己下去了解一下

八、关于每次修改完页面,均不用再去打包一遍了(devServe)

现在来介绍三种方法:

第一种:但是要注意项目第一次打包的之后要用 npm run watch,每次修改完就不用打包了,直接刷新页面就行

//修改package.json中的配置项

"scripts": {
    "bundle": "webpack",
    "watch":"webpack --watch"
  }

第二种:devServer,这种他会自动开启一个服务器,对比上一中的好处是都不用刷新了,实时更新修改

配置webpack.config.js   devServer:{ contentBase :‘./dist’}

       package.json   "start":"webpack-dev-server"

九、HotMoudleReplacement热模块替换

用devServer打包时会发现没有dist目录了,这是因为他自动存入了内存,从而使打包速度更快,若想看到dist目录,就用

npx webpack

模块配置:

const webpack = require('webpack');

plugins: [
		new HtmlWebpackPlugin({
			template: 'src/index.html'
		}),
		new CleanWebpackPlugin(),
		new webpack.HotModuleReplacementPlugin()
	],


devServer:{
		contentBase:'./dist',
		open:true,
		hot:true,
		hotOnly:true//即使HMP不生效,浏览器也不会自动刷新
	}

若css效果发生了改变,页面只会刷新使用的那部分css,不会刷新整个页面,注意这个插件是webpack自带的,所以不用安装,但是要require(‘webpack’),配置时用new webpack.HotMoudleReplacementPlugin()

上面只是介绍的css文件改变时,应该怎么办,但其实也可能一个index.js中引入过了js文件,其中一个引入的一个js文件发生变化时,如果还按照上面的方法配置将会导致文件改变页面也没有效果,所以这样做

//index.js中的内容

import counter from './counter.js';
import number from './number.js';

counter();
number();

//若在开发过程中number.js发生变化

if(module.hot){
    module.hot.accept('./number', () => {
        //保证将上一次产生的结果清除掉
        document.body.removeChild(...);
        number();
    })
}

之所以css不用这样写,是因为css-loader已经帮忙实现了,就不用自己写了

十、babel  ES6

将由于一些比较不够与时俱进的浏览器无法识别ES6语法,转换为ES5的语法,关于配置可参照babel的官方网站 Setup-webpack

首先进行安装

npm install --save-dev babel-loader @babel/core
npm install @babel/preset-env --save-dev

webpack.config.js配置

{ 
	test: /\.js$/, 
	exclude: /node_modules/, //如果js文件时在node_modules文件中,就不试用babel-loader了第三方的模块没有必要转ES5
	loader: "babel-loader" ,
	options:{
	    "presets": ["@babel/preset-env"]
}

这样打包就可以了,ES6的语法变成了ES5的语法,但是光是这样子是不够的,例如promise这种在低版本的浏览器中还是不存在的,所以不仅要用@babel/preset-env做语法的转换,还要讲这些确实的东西补充进低版本浏览器中,使用@babel/polyfill,首先进行安装

npm install --save @babel/polyfill

但是问题又来了,打包后的文件特别大,是因为我们将除了promise和map的其他方法也打包进来了,但我们这个项目的业务代码只用到了promise和map所以我们只需这两个就行,就需要一个配置参数

{ 
	test: /\.js$/, 
	exclude: /node_modules/, 
	loader: 'babel-loader',
	options:{
		presets: [['@babel/preset-env',{
			    	useBuildIns:'usage'
		}]]
        } 
}

还有一个问题是,如果你开发类库组件库时,用这种方案是有问题的,因为babel-polyfill会让浙西方法全局注入,会污染全局环境,所以我们要换一种配置方式:注释掉import "@babel/polyfill"并安装:

npm install --save-dev @babel/plugin-transform-runtime
npm install --save @babel/runtime
npm install --save @babel/runtime-corejs2
{ 
			test: /\.js$/, 
			exclude: /node_modules/, 
			loader: 'babel-loader',
			options:{
			    // presets: [['@babel/preset-env',{
			    // 	useBuildIns:'usage'
			    // }]]
			    "plugins": [["@babel/plugin-transform-runtime",{
			        "corejs": 2,
			        "helpers": true,
			        "regenerator": true,
			        "useESModules": false
			    }]]
            } 
		}

如果只是简单业务代码那么只需要presets和import "@babel/polyfill"即可,如果是库项目那就要写下边的一大堆plugins了,注意适应场景不同

我们发现babel的配置参数特别多特别长,所以我们可以吧他们放在一个文件中 .babelrc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack4---模块化打包工具(一) 的相关文章

随机推荐

  • 读取和写入文本文件

    读取和写入文本文件 Read a Text File 的这篇文章部分描述如何使用 StreamReader 类来读取文本的文件 Write a Text File Example 1 和 Write a Text File Example
  • 上传图片到七牛云

    1 首先我们需要先创建七牛云账号 并完成认证 七牛云 一站式场景化智能视频云 2 创建自己的存储空间 第一步 点击对象存储kodo 2 进入后点击空间管理 3 创建自己的存储空间 需要注意访问控制要选择公开 4 进入个人中心 gt 密钥管理
  • ImportError: cannot import name ‘XXXA‘ from ‘XXXB‘

    ImportError cannot import name XXXA from XXXB 废话不多说直接看问题 废话不多说直接看问题 ImportError cannot import name XXXa from XXXB 当你排除拼写
  • 四阶行列式直接展开_01行列式的定义上海交大

    本文文字和图片非原创 来源如下 强烈推荐原视频 作者 上海交通大学 知名教授 蒋启芬 高云 崔振等 平台 网易公开课 内容 线性代数 第一讲 行列式的定义 序言 对二元一次方程组 几何意义 平面上的两条动直线 通过加减消元可以变形到下边这种
  • 如何将本地项目上传至Gitee仓库(详细教程)

    码云 Gitee 简单介绍 Git 是一个开源的分布式版本控制系统 用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 Git 与常用的版本控
  • C++-函数模板特化如何避免重复定义

    我正在用一个基于模板的库源代码 该库包含一些针对特定类型的模板函数特化 类模板 函数模板和模板函数特化都在头文件中 我在我的 cpp文件中 include 头文件并编译链接工程 但是为了在整个工程中使用该库 我将头文件包含在 stdafx
  • Linux——线程安全

    概念 线程安全就是在多线程运行的时候 不论线程的调度顺序怎样 最终的结果都是一样的 正确的 那么就说这些线程是安全的 要保证线程安全需要做到 对线程同步 保证同一时刻只有一个线程访问临界资源 在多线程中使用线程安全的函数 可重入函数 所谓线
  • sql语句多表查询

    问题及描述 1 学生表 Student S Sname Sage Ssex S 学生编号 Sname 学生姓名 Sage 出生年月 Ssex 学生性别 2 课程表 Course C Cname T C 课程编号 Cname 课程名称 T 教
  • 微信小程序客服功能接入指南

    一 功能介绍 1 客服消息会话入口有两个 1 小程序内 开发者在小程序内添加客服消息按钮组件 用户可在小程序内唤起客服会话页面 给小程序发消息 2 已使用过的小程序客服消息会聚合显示在微信会话 小程序客服消息 内 用户可以在小程序外查看历史
  • Windows 10 安装wsl(linux子系统)

    目录 1 简介 2 检查windows 系统版本 是否符合要求 3 安装wsl2 2中方式 3 1手动安装 3 2 应用商店安装 4 资料参考 1 简介 wsl是适用于windows环境linux子系统 支持windows 10 11和wi
  • 软件测试基础理论详解

    1 软件测试定义 软件测试 Software Testing 在规定的条件下对程序进行操作 以发现程序错误 衡量软件质量 并对其是否能满足设计要求进行评估的过程 2 软件测试工程师的素质 良好的沟通和表达能力 具有怀疑与破坏的精神 扎实的软
  • Unity实现异步加载场景

    一 创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel 取名为LoadScreen 再在loadScreen下面创建一个Image组件 放置背景图片 然后我们再在lpadScreen下面继续创建一个Slider 这
  • jdbc C3P0容错和自动重连

    1 C3P0容错和自动重连与以下配置参数有关 breakAfterAcquireFailure true表示pool向数据库请求连接失败后标记整个pool为block并close 就算后端数据库恢复正常也不进行重连 客户端对pool的请求都
  • CentOS8基础篇14:使用源代码安装FTP软件

    一 TAR包管理工具简介 TAR Tape Archive TAR 是Linux下的包管理工具 利用tar命令可以将要备份保存的数据打包成一个扩展名为 tar的文件 以便文件的保存 需要使用时再利用tar命名进行释放即可 使用tar命令对文
  • Java面向对象编程

    下面有关JVM内存 说法错误的是 A 程序计数器是一个比较小的内存区域 用于指示当前线程所执行的字节码执行到了第几行 是线程隔离的 B Java方法执行内存模型 用于存储局部变量 操作数栈 动态链接 方法出口等信息 是线程隔离的 C 方法区
  • 自己组装电脑配置清单2022 自己组装电脑需要哪些配件

    自己组装电脑需要主板 CPU处理器 CPU散热器 内存条 显卡 硬盘 鼠标 键盘 声卡 耳机 音箱 机箱 显示器 电源等等 组装电脑怎么搭配更合适这些点很重要 http www adiannao cn du 3500左右性价比游戏型组装电脑
  • 【RPA】机器人流程自动化(RPA)概念、原理与实践

    多数人每天都会使用到一些机器人流程自动化工具 例如读取邮件和系统 计算 生成文件和报告 而在未来 那些你不想做的枯燥的工作 也许真的可以不做了 重复化 标准化的工作都可以让机器人帮你完成 本期推文特邀陈剑独家原创阐述RPA的概念 原理与实践
  • Kubernetes 的控制器模型

    文章目录 控制器模式 控制循环 控制器的配置和定义 Deployment 控制器详解 水平扩展 收缩 滚动更新 版本控制 控制器模式 本篇文章我们来看看 编排 这个 Kubernetes 项目最核心的功能吧 经过上篇文章的介绍后 你可能已经
  • redis主从-哨兵模式(windows下搭建)

    一 下载 由于redis官方并不支持windows操作系统 所以官网上是下不到的 需要到gitlab上下载 下载地址如下 https github com MicrosoftArchive redis releases 二 解压安装 将下载
  • webpack4---模块化打包工具(一)

    一 webpack4初识 1 首先先了解几个规范 ES规范 导出 export default Header 导入 import Header from header js CommonJS规范 导出 module exports Head