webpack4打包工具

什么是webpack

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

可以做的事情

代码转换、文件优化、代码分割、模块合并、自动刷新、代码校验、自动发布
复制代码

需要提前掌握的内容

  • 需要node基础,以及npm的使用
  • 掌握es6语法

主要学习webpack哪些内容

  • webpack常见配置
  • webpack高级配置
  • webpack优化策略
  • ast抽象语法树
  • webpack中的Tapable
  • 掌握webpack流程,手写webpack
  • 手写webpack中常见的loader
  • 手写webpack中常见的plugin

创建文件

mkdir webpack-test && cd webpack-test
mkdir src
touch src/index.js
复制代码

初始化文件

npm init -y  初始文件(默认的)
npm init 
复制代码

开始打包

npx webpack
复制代码

配置webpack.config.js

touch webpack.config.jsconst path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {devServer: { // 开发服务器的配置contentBase: path.join(__dirname, 'dist'),compress: true,port: 3000},mode: 'development', // 模式 默认两种production developmententry: './src/index.js', //入口output: {filename: 'bundle.js', //打包后的文件名path: path.resolve(__dirname, 'dist'), //路径必须是一个绝对路径},plugins: [// 数组放着所有的webpack插件new HtmlWebpackPlugin({template: './src/index.html',filename: 'index.html'})]
}
复制代码

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><div id="root"></div><script src="bundle.js"></script>
</body>
</html>
复制代码

index.js

var root = document.getElementById("root");
root.innerHTML="你好"
复制代码

webpack常见配置

npm i webpack webpack-cli -D
npm i html-webpack-plugin -D
复制代码

使用模板 html

  • html-webpack-plugin 可以指定template模板文件,将会在output目录下,生成html文件,并引入打包后的js.
npm i  html-webpack-plugin -D
复制代码

webpack-dev-server

  • webpack-dev-server提供了一个简单的Web服务器和实时热更新的能力
npm i webpack-dev-server -D
复制代码

pagkage.js

{"name": "webpack-test","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack-dev-server","build": "webpack"},"keywords": [],"author": "","license": "ISC","devDependencies": {"html-webpack-plugin": "^3.2.0","webpack": "^4.30.0","webpack-cli": "^3.3.0","webpack-dev-server": "^3.3.1"}
}复制代码

目前的目录

启动项目

npm run dev
复制代码

浏览器输入http://localhost:3000/

加载样式文件

  • 在src目录下创建一个index.css
body{background-color:red;
}
复制代码
  • 在index.js中引入index.css
require('./index.css');
复制代码
  • webpack.config.js增加一些参数
module: { //模块rules: [ // 规则 css-loader //  style-loader 把css插入到head的标签中//  loader的特点: 希望单一//  loader的用法: 字符串只用一个loader//  多个loader需要[]//  loader的顺序 默认是从右向左执行//  loader还可以写出对象方式{test: /\.css$/,use: ['style-loader','css-loader']},]
}
复制代码
  • css-loader style-loader
npm i  css-loader style-loader -D
复制代码
  • 效果如下

加载less(sass,stylus类似)

  • 在src目录下创建一个index.less
body{#root{border:1px yellow solid;color: #000;}
}
复制代码
  • 在index.js中引入index.less
require('./index.css');
复制代码
  • webpack.config.js增加一些参数
 {test: /\.less$/,use: [{loader: 'style-loader',},'css-loader','less-loader']},
复制代码
  • less-loader
npm i less less-loader -D
复制代码
  • 效果如下

提取单独打包css文件

npm i mini-css-extract-plugin -D
复制代码
  • webpack.config.js增加一些参数
const MiniCssExtractPlugin = require('mini-css-extract-plugin');plugins: [ new MiniCssExtractPlugin({filename: 'main.css'})],
module: { //模块use: [MiniCssExtractPlugin.loader,]},{test: /\.less$/,use: [MiniCssExtractPlugin.loader,]}]}
复制代码

css3样式自动加前缀

npm i postcss-loader autoprefixer -D
复制代码
  • 在webpack-test创建postcss.config.js
module.exports = {plugins: [require('autoprefixer')]
}
复制代码
  • webpack.config.js增加一些参数
{test: /\.css$/,use: [{loader: 'style-loader',//    options: {//        insertAt: 'top' //内联样式最高级//    }},'css-loader','postcss-loader']},{test: /\.less$/,use: [{loader: 'style-loader',},'css-loader','postcss-loader','less-loader']
}
复制代码

转化es6语法

npm i babel-loader @babel/core @babel/preset-env -D
npm i @babel/plugin-proposal-class-properties -D
复制代码
  • webpack.config.js增加一些参数
rules: [ 
{
test: /\.js$/,
use: {loader: 'babel-loader',options: { // 用babel-loader 需要把es6-es5presets: ['@babel/preset-env'],plugins: ['@babel/plugin-proposal-class-properties']}
}
] 
复制代码

全局变量引入

npm i jquery -D
npm i expose-loader -D
复制代码

第一种

  • import $ from 'jquery';
  • webpack.config.js增加一些参数
 rules: [ {test: require.resolve('jquery'),use: 'expose-loader?$'},
]
复制代码

第二种

  • webpack.config.js增加一些参数
const webpack = require('webpack');
plugins: [ // 数组放着所有的webpack插件new webpack.ProvidePlugin({$: 'jquery' // 在每个模块中注入$对象})
],
复制代码

引入图片处理

// 1.在js中创建图片来引入
// 2.在css引入backgroud('url')
// 3.<img src="" alt="" />>
npm i file-loader -D
npm i html-withimg-loader -D
复制代码
  • webpack.config.js增加一些参数
rules: [ {test: /\.html$/,use: 'html-withimg-loader'},{test: /\.(png|jpg|gif)$/,use: 'file-loader'},
]
复制代码
  • 限制图片大小
npm i url-loader -D
复制代码
  • webpack.config.js增加一些参数
 {test: /\.(png|jpg|gif)$/,use: {loader: 'url-loader',options: {limit: 200*1024}}
复制代码

images和css打包分类

  • webpack.config.js增加一些参数
 plugins: [ // 数组放着所有的webpack插件new MiniCssExtractPlugin({filename: 'css/main.css'}),
],
{test: /\.(png|jpg|gif)$/,use: {loader: 'url-loader',options: {limit: 1,outputPath: '/img/',publicPath: 'https://www.baidu.com' // 在图片上加域名}}
复制代码

多页面打包

  • 在scr创建一个other.js
console.log("other 一路走好!")
复制代码
  • webpack.config.js增加一些参数
// 多入口
entry: {index: './src/index.js', home: './src/other.js',
},
output: {filename: '[name].js', //打包后的文件名path: path.resolve(__dirname, 'dist'), //路径必须是一个绝对路径// publicPath: 'https://www.baidu.com'
},
plugins: [ // 数组放着所有的webpack插件new HtmlWebpackPlugin({template: './src/index.html',filename: 'index.html',chunks: ['index']}),new HtmlWebpackPlugin({template: './src/index.html',filename: 'home.html',chunks: ['home']}),
]
复制代码

配置source-map调试代码

  • webpack.config.js增加一些参数
output: {filename: '[name].js', //打包后的文件名path: path.resolve(__dirname, 'dist'), //路径必须是一个绝对路径// publicPath: 'https://www.baidu.com'
},
// devtool: 'source-map', // 1.增加映射文件 可以帮我们调试源代码
// devtool: 'eval-source-map', // 2.不会产生单独的文件,但是可以显示行和列
// devtool: 'cheap-module-source-map', // 3.不会产生列,但是是一个单独的映射文件(产生后你可以保留起来)
devtool: 'cheap-module-eval-source-map',// 4.不会长生文件,集成在打包后的文件中不会产生列
复制代码

watch实时打包

  • webpack.config.js增加一些参数
entry: {index: './src/index.js', home: './src/other.js',
},
watch: true,
watchOptions: { // 监控的选项poll: 1000, // 每秒问我1000次aggregateTimeout: 500, // 防抖ignored: /node_modules/ // 不需要进行监控哪个文件
},
复制代码

常用的小插件

  • 清除dist (clean-webpack-plugin)
  • 拷贝文件(copy-webpack-plugin)
  • 版权注释(bannerPlugin)
npm i clean-webpack-plugin -D
npm i copy-webpack-plugin -D
复制代码
  • 在webpack-test创建doc文件,里面创建hello.txt
  • webpack.config.js增加一些参数
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
plugins: [ new CleanWebpackPlugin(),new CopyWebpackPlugin([{from: 'doc', to: './'}]),new webpack.BannerPlugin('cl by 2019')
],
复制代码

webpack跨域问题

npm i express -D
复制代码
  • 1)webpack代理
  • 在webpack-test目录下创建server.js
let express = require('express');
let app = express();
app.get('/user', (req, res)=> {res.json({ name: "xiaolin3333" })
})
app.listen(3000);
复制代码
  • webpack.config.js配置
 devServer: { // 开发服务器的配置// 1)http:proxyproxy: {// 重新的方式 把请求代理到express服务器!'/api': {target: 'http://localhost:3000',pathRewrite: {'/api': ''}} // 配置了一个代理}},
复制代码
  • index.js
let xhr = new XMLHttpRequest();xhr.open('GET', '/api/user', true);xhr.onload = function() {console.log(xhr.response,);
}xhr.send();
复制代码
  • 启动 node server.js && npm run dev
  • 2)前端只想单纯来模拟数据
  • webpack.config.js配置
devServer: { // 开发服务器的配置// 2)前端只想单纯来模拟数据before(app) { // 提供的方法 钩子app.get('/user', (req, res)=> {res.json({ name: "xiaolinwww" })})}
复制代码
  • index.js
let xhr = new XMLHttpRequest();
xhr.open('GET', '/user', true);xhr.onload = function() {console.log(xhr.response,);
}xhr.send();
复制代码
  • 启动 npm run dev
  • 3)有服务端 不想用代理来处理 能不能再服务端中启动webpack端口用服务端口
npm i webpack-dev-middleware -D
复制代码
  • server.js
let express = require('express');let app = express();
let webpack = require('webpack');// 中间件
let middle = require('webpack-dev-middleware');let config = require('./webpack.config');let compiler = webpack(config);app.use(middle(compiler));app.get('/user', (req, res)=> {res.json({ name: "xiaolin3333-webpack-dev-middleware" })
})app.listen(3000);
复制代码
  • index.js
let xhr = new XMLHttpRequest();
xhr.open('GET', '/user', true);xhr.onload = function() {console.log(xhr.response,);
}xhr.send();
复制代码
  • 启动 node server && http://localhost:3000/

resolve属性的配置

yarn add css-loader style-loader -D
复制代码
  • index.js
import './style';style.cssbody{background-color:green;transform: rotate(90deg);
}
复制代码
  • webpack.config.js配置
resolve: {// 解析第三方包 commonmodules: [path.resolve('node_modules')],extensions: ['.js','.css','.vue']
//    alias: { // 别名 vue vue.runtime
//       bootstrap: 'bootstrap/dist/css/bootstrap.css'
//    },
//    mainFields: ['style', 'main']
//    mainFields: [],// 入口文件的名字index.js
},module: { //模块rules: [ {test: /\.css$/,use: ['style-loader','css-loader']},]
}
复制代码

项目文件未更新

  • github.com/chenlin1/we…

今天到此结束,明天更新。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过计算机网络进行的商务活动包括,电子商务练习题及答案

“电子商务”练习题一、填空题1&#xff0e;EDI系统构成三要素包括数据标准化、(EDI软件及硬件)和(通信网络)。2.B2C电子商务模式主要有&#xff1a;门户网站、(电子零售商)、(内容提供商)、(交易经纪人)和社区服务商。3. 影响消费者网上购物的因素&#xff1a;商品特性、(商品…

PAKDD 2019 都有哪些重要看点?看这篇文章就够了!...

雷锋网 AI 科技评论按&#xff1a;亚太地区知识发现与数据挖掘国际会议&#xff08;Pacific Asia Knowledge Discovery and Data Mining&#xff0c;PAKDD&#xff09;是亚太地区数据挖掘领域的顶级国际会议&#xff0c;旨在为数据挖掘相关领域的研究者和从业者提供一个可自由 …

「javaScript-每三位插入一个逗号实现方式」

一道火了很久的面试题&#xff0c;//将以下数字从小数点前开始每三位数加一个逗号var num 1234567890.12345;复制代码相信大家写了这么久的前端代码&#xff0c;不论是培训也好&#xff0c;面试也好&#xff0c;这种题出现的频率挺高的&#xff0c;网上方法很多&#xff0c;但…

计算机网络df例题,计算机网络期末试题北交.doc

计算机网络期末试题北交北京交通大学 2007-2008学年 第学期考试试题课程名称&#xff1a;计算机通信与网络技术 出题人&#xff1a;网络课程组题 号一二三五总分得 分签 字选择题(每题分&#xff0c;共0分)PING命令使用协议的报文A、TCP ?? ?B、UDP ??????????C、…

java B2B2C 仿淘宝电子商城系统-Spring Cloud Feign的文件上传实现

在Spring Cloud封装的Feign中并不直接支持传文件&#xff0c;但可以通过引入Feign的扩展包来实现&#xff0c;本文就来具体说说如何实现。需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零三八七七四六二六 服务提供方&#xff08;接收文件&#…

2021计算机三级网络技术教程,全国计算机等级考试三级教程——网络技术(2021年版)...

前辅文第一单元 网络规划与设计第1章 网络系统结构与设计的基本原则1.1 基础知识1.2 实训任务习题第2章 中小型网络系统总体规划与设计方法2.1 基础知识2.2 实训任务习题第3章 IP地址规划设计技术3.1 基础知识3.2 实训任务习题第4章 路由设计基础4.1 基础知识4.2 实训任务习题第…

subline Text3 插件安装

--没有解决&#xff0c;换了vscode 安装Package Control 这是必须的步骤&#xff0c;安装任何插件之前需要安装这个 自动安装的方法最方便&#xff0c;只需要在控制台&#xff08;不是win的控制台&#xff0c;而是subline 的&#xff09;里粘贴一段代码就好&#xff0c;但是由…

大学计算机基础书本里的毕业论文源稿,计算机基础毕业论文范文

计算机基础毕业论文范文导语&#xff1a;关于大学计算机基础的教学&#xff0c;需要不断探索与实践&#xff0c;实现更好的教学。下面是小编带来的计算机基础毕业论文&#xff0c;欢迎阅读与参考。论文&#xff1a;大学计算机基础教学的探索与实践摘要&#xff1a;大学计算机基…

p批处理替换目录下文本中的字符串

echo offrem 进入批处理文件所在的路径 cd C:\Users\zxh\Desktop\123echo ***** Replace "123" as "abc" ***** rem 定义要替换的新旧字符串 set strOld123 set strNewabcrem 定义变量修改本地化延期 setlocal enabledelayedexpansionrem 循环取出要处理的…

计算机技术基础 VB 答案,《计算机技术基础(VB)》武汉理工大学20春作业一

计算机技术基础(VB)_作业一1.[判断题] 写在一行上的多条语句&#xff0c;应以逗号作为分隔符。奥鹏作业答案可以联系QQ 761296021A.正确B.错误正确答案:——B——2.[判断题] 滚动条的最小值、最大值、最小变动值、最大变动值属性均可自行设计。A.正确B.错误正确答案:——A——3…

公务员计算机考试题库,公务员考试题库

2019年上半年&#xff0c;我国服务进出口总额达到26124.6亿元&#xff0c;同比增长2.6%。其中&#xff0c;出口总额9333.7亿元&#xff0c;同比增长9.0%&#xff1b;进口总额16790.8亿元&#xff0c;同比下降0.6%。服务进出口总额占对外贸易总额的比重达到15.1%&#xff0c;比2…

Spring MVC 实现Excel的导入导出功能(2:Excel的导入优化和Excel的导出)

Excel的导入V2优化版 有些时候文件上传这一步骤由前端来处理&#xff0c;只将上传后的 URL 传输给后端&#xff08;可以参考上一文中的图片上传功能&#xff09;&#xff0c;也就是导入请求中并不会直接处理 MultipartFile 对象&#xff0c;而是通过文件 URL 将其下载&#xff…

计算机系统应用属于ei,2018年度中心成员发表论文清单(SCI、EI收录)

序号论文名称作者发表时间发表刊物名及ISSN号论文类别(SCI(请写明几区)、EI、AB类刊物、CSCD)1Power Allocation Study for Non-Orthogonal Multiple Access Networks With Multicast-Unicast TransmissionZheng Yang , Member, IEEE, Jamal Ahmed Hussein , Peng Xu , Member,…

ts基础总结

ts有什么用 类型检查, 拥抱es6&#xff0c;支持部分的esNext草案&#xff0c;直接编译到原生js、引入新的语法糖 为什么用ts TypeScript的设计目的应该是解决JavaScript的“痛点”&#xff1a;弱类型和没有命名空间&#xff0c;导致很难模块化&#xff0c;不适合开发大型程序。…

CentOS7启用SELinux和Firewall修改ssh端口号

基本信息 CentOS :CentOS Linux release 7.6.1810 (Core)SELinux:enforcedFirewall:enforcing生成ssh密钥对 生成密钥对 ssh-keygen -t rsa -b 2048 #默认存放的位置是/home/user/.ssh&#xff0c;使用的是公钥id_rsa.pub从服务器中将私钥复制到本机或者使用本地生成的密钥对&a…

华为智能手环智能手表软件测试,一块智能手表的测试之旅,揭秘华为运动健康科学实验室...

随着消费者对健康生活的日益关注&#xff0c;随之而来的是智能可穿戴设备的蓬勃发展。一个手环&#xff0c;一个智能手表&#xff0c;都可以为消费者提供诸如心率&#xff0c;步数相关的数据统计。而更进阶的设备&#xff0c;则能为用户提供系统的运动解决方案以及监控人体健康…

Flutter 使用动画播放一组图片

请支持原文&#xff1a;tryenough.com/images-anim… 效果如下图&#xff1a; 代码 import package:flutter/material.dart; import package:sprintf/sprintf.dart; //这个是一个拼接字符串的flutter库&#xff0c;主要是为了使用方便&#xff0c;你可以选择不使用&#xff0c…

软件测试都有哪些证书,软件测试都有哪些证书呀?有用吗?

OYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学习论坛 www.oywp.netOYWP学…

超低频测试信号产生电路软件流程图,一种0_20Hz超低频信号发生器的设计与实现...

。。第22卷第4期增刊           仪 器 仪 表 学 报             2001年8月一种0&#xff5e;20Hz超低频信号发生器的设计与实现马彦恒 郭 利 于久恩 (军械工程学院 石家庄 050003)摘要 本文介绍了一种采用了主—从式双CPU结构,频率和幅度都…

datastage 使用小结

转载于:https://www.cnblogs.com/Guhan-xue/p/10758663.html