安装webpack及使用

前言
你是否也是只会运用框架中集成好的Webpack配置呢?你明白每一项的意义么?你懂多少Webpack的个性化配置项呢?本篇文章为你讲解Webpack中的各种配置项参数及作用!
在这里插入图片描述

文章目录

  • 了解Webpack相关
  • 开启项目
  • 编译打包应用
  • 使用webpack配置文件
  • 打包less资源
  • js语法检查
  • js语法转换
  • js兼容性处理
  • 打包样式文件中的图片资源
  • 打包html文件
  • 打包html中图片资源
  • 打包其他资源
  • 自动编译打包运行
  • 热模替换功能
  • devtool
  • 准备生产环境
  • 清除打包文件目录
  • 提取css成单独文件
  • 添加css兼容
  • 压缩css
  • 压缩html

了解Webpack相关

什么是webpack
Webpack是一个模块打包器(bundler)。
在Webpack看来, 前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理
它将根据模块的依赖关系进行静态分析,生成对应的静态资源

五个核心概念
Entry:入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。
Loader:loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只能解析 JavaScript)。
Plugins:插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。
Mode:模式,有生产模式production和开发模式development

理解Loader
Webpack 本身只能加载JS/JSON模块,如果要加载其他类型的文件(模块),就需要使用对应的loader 进行转换/加载
Loader 本身也是运行在 node.js 环境中的 JavaScript 模块
它本身是一个函数,接受源文件作为参数,返回转换的结果
loader 一般以 xxx-loader 的方式命名,xxx 代表了这个 loader 要做的转换功能,比如 json-loader。

理解Plugins
插件可以完成一些loader不能完成的功能。
插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。

配置文件(默认)
webpack.config.js : 是一个node模块,返回一个 json 格式的配置信息对象

开启项目

初始化项目:

生成package.json文件

	      {"name": "webpack_test","version": "1.0.0"} 

安装webpack

npm install webpack webpack-cli -g  //全局安装,作为指令使用
npm install webpack webpack-cli -D //本地安装,作为本地依赖使用

编译打包应用

创建js文件

  • src/js/app.js
  • src/js/module1.js
  • src/js/module2.js
  • src/js/module3.js

创建json文件

 src/json/data.json  

创建主页面:

  src/index.html

运行指令

  • 开发配置指令:webpack src/js/app.js -o dist/js/app.js --mode=development
  • 功能: webpack能够编译打包js和json文件,并且能将es6的模块化语法转换成浏览器能识别的语法
  • 生产配置指令:webpack src/js/app.js -o dist/js/app.js --mode=production
  • 功能: 在开发配置功能上加上一个压缩代码

结论:

  • webpack能够编译打包js和json文件
  • 能将es6的模块化语法转换成浏览器能识别的语法
  • 能压缩代码

缺点:

  • 不能编译打包css、img等文件
  • 不能将js的es6基本语法转化为es5以下语法

改善: 使用webpack配置文件解决,自定义功能

使用webpack配置文件

目的:
在项目根目录定义配置文件,通过自定义配置文件,还原以上功能

文件名称:
webpack.config.js

文件内容:

    const { resolve } = require('path'); //node内置核心模块,用来设置路径。module.exports = {entry: './src/js/app.js',   // 入口文件配置(简写)/*完整写法:entry:{main:'./src/js/app.js'}*/output: {                     // 输出配置filename: './js/built.js',      // 输出文件名path: resolve(__dirname, 'build')   //输出文件路径配置},mode: 'development'   //开发环境(二选一)mode: 'production'   //生产环境(二选一)};

运行指令: webpack

打包less资源

概述:
less文件webpack不能解析,需要借助loader编译解析

创建less文件

  • src/less/test1.less
  • src/less/test2.less
  • 入口app.js文件
    • 引入less资源
  • 安装loader
    npm install css-loader style-loader less-loader less --save-dev

配置loader

	{test: /\.less$/, // 检查文件是否以.less结尾(检查是否是less文件)use: [  // 数组中loader执行是从下到上,从右到左顺序执行'style-loader', // 创建style标签,添加上js中的css代码'css-loader', // 将css以commonjs方式整合到js文件中'less-loader'  // 将less文件解析成css文件]},

运行指令: webpack

js语法检查

概述:
对js基本语法错误/隐患,进行提前检查

安装loader

  • npm install eslint-loader eslint --save-dev
  • 备注1:在:eslint.org网站 -> userGuide -> Configuring ESLint 查看如何配置
  • 备注2:在:eslint.org网站 -> userGuide -> Rules 查看所有规则

配置loader

 module: {rules: [{test: /\.js$/,  //只检测js文件exclude: /node_modules/,  //排除node_modules文件夹enforce: "pre",  //提前加载使用use: { //使用eslint-loader解析loader: "eslint-loader" }}        ]}

加粗样式

	"eslintConfig": {"parserOptions": {"ecmaVersion": 6, 		// 支持es6"sourceType": "module"	// 使用es6模块化},"env": { // 设置环境"browser": true,   // 支持浏览器环境: 能够使用window上的全局变量"node": true       // 支持服务器环境:  能够使用node上global的全局变量},"globals": {	// 声明使用的全局变量, 这样即使没有定义也不会报错了"$": "readonly"	// $ 只读变量},"rules": {  // eslint检查的规则  0 忽略 1 警告 2 错误"no-console": 0, 	// 不检查console"eqeqeq": 2,	// 用==而不用===就报错"no-alert": 2 // 不能使用alert},"extends": "eslint:recommended" // 使用eslint推荐的默认规则 https://cn.eslint.org/docs/rules/},

运行指令: webpack

js语法转换

概述:
将浏览器不能识别的新语法转换成原来识别的旧语法,做浏览器兼容性处理

安装loader

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

配置loader

    module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: "babel-loader",options: {presets: ['@babel/preset-env']}}}]}

运行指令: webpack

js兼容性处理

第一种方法:使用经典的polyfill

安装包

npm install @babel/polyfill

使用

app.js
import '@babel/polyfill'; // 包含ES6的高级语法的转换

优点
解决babel只能转换部分低级语法的问题(如:let/const/解构赋值…),引入polyfill可以转换高级语法(如:Promise…)

缺点
将所有高级语法都进行了转换,但实际上可能只使用一部分

解决
需要按需加载(使用了什么高级语法,就转换什么,而其他的不转换)

第二种方法:借助按需引入core-js按需引入

安装包

npm install core-js

配置loader

{test: /\.js$/,exclude: /(node_modules)/,use: {loader: 'babel-loader',options: {presets: [['@babel/preset-env',{useBuiltIns: 'usage',  // 按需引入需要使用polyfillcorejs: { version: 3 }, // 解决warntargets: { // 指定兼容性处理哪些浏览器"chrome": "58","ie": "9",}}]],cacheDirectory: true, // 开启babel缓存}}},

打包样式文件中的图片资源

概述:图片文件webpack不能解析,需要借助loader编译解析

添加2张图片:

  • 小图, 小于8kb: src/images/vue.png
  • 大图, 大于8kb: src/images/react.jpg
  • 在less文件中通过背景图的方式引入图片

安装loader

npm install file-loader url-loader --save-dev 

补充
url-loader是对象file-loader的上层封装,使用时需配合file-loader使用。

配置loader

	{test: /\.(png|jpg|gif)$/,use: {loader: 'url-loader',options: {limit: 8192, // 8kb --> 8kb以下的图片会base64处理outputPath: 'images', // 决定文件本地输出路径publicPath: '../build/images',  // 决定图片的url路径name: '[hash:8].[ext]' // 修改文件名称 [hash:8] hash值取8位  [ext] 文件扩展名}}},

运行指令: webpack

打包html文件

概述
html文件webpack不能解析,需要借助插件编译解析

添加html文件
src/index.html
注意不要在html中引入任何css和js文件

安装插件Plugins

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

在webpack.config.js中引入插件(插件都需要手动引入,而loader会自动加载)

const HtmlWebpackPlugin = require('html-webpack-plugin')

配置插件Plugins

    plugins: [new HtmlWebpackPlugin({template: './src/index.html', // 以当前文件为模板创建新的HtML(1. 结构和原来一样 2. 会自动引入打包的资源)}),]

运行指令: webpack

打包html中图片资源

概述:
html中的图片url-loader没法处理,它只能处理js中引入的图片 / 样式中图片,不能处理html中img标签,需要引入其他html-loader处理。

添加图片
在src/index.html添加两个img标签

安装loader

npm install html-loader --save-dev 

配置loader

    {test: /\.(html)$/,use: {loader: 'html-loader'}}

运行指令: webpack

打包其他资源

概述:
其他资源webpack不能解析,需要借助loader编译解析

添加字体文件

  • src/media/iconfont.eot
  • src/media/iconfont.svg
  • src/media/iconfont.ttf
  • src/media/iconfont.woff
  • src/media/iconfont.woff2

修改样式

 @font-face {font-family: 'iconfont';src: url('../media/iconfont.eot');src: url('../media/iconfont.eot?#iefix') format('embedded-opentype'),url('../media/iconfont.woff2') format('woff2'),url('../media/iconfont.woff') format('woff'),url('../media/iconfont.ttf') format('truetype'),url('../media/iconfont.svg#iconfont') format('svg');}.iconfont {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;}

配置loader

	{test: /\.(eot|svg|woff|woff2|ttf|mp3|mp4|avi)$/,  // 处理其他资源loader: 'file-loader',options: {outputPath: 'media',name: '[hash:8].[ext]'}}

运行指令: webpack

自动编译打包运行

安装loader

npm install webpack-dev-server --save-dev

详细配置见官网:指南 -> 开发环境 -> 使用webpack-dev-server
修改webpack配置对象(注意不是loader中)

    devServer: {open: true, // 自动打开浏览器compress: true, // 启动gzip压缩port: 3000, // 端口号}

修改url-loader部分配置

  • 因为构建工具以build为根目录,不用再找build了
  • publicPath: '../build/images/' --> publicPath: 'images/'

修改package.json中scripts指令

"start": "webpack-dev-server",

运行指令: npm run start

注意webpack-dev-server指令才能启动devServer配置,然后配置到package.json中才行

热模替换功能

概述:
热模块替换(HMR)是webpack提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新(只更新变化的模块,不变的模块不更新)。

详细配置见官网:指南 -> 模块热替换

修改devServer配置

    devServer: {contentBase: resolve(__dirname, 'build'), // 运行项目的目录open: true, // 自动打开浏览器compress: true, // 启动gzip压缩port: 3000, // 端口号hot: true // 开启热模替换功能 HMR}

问题: html文件无法自动更新了,需要增加一个入口

  entry: ['./src/js/app.js','./src/index.html']

devtool

概述:
一种将压缩/编译文件中的代码映射回源文件中的原始位置的技术,让我们调试代码不在困难

详细配置见官网:配置 -> devtool

介绍
cheap 只保留行, 编译速度快
eval webpack生成的代码(每个模块彼此分开,并使用模块名称进行注释), 编译速度快
inline 以base64方式将source-map嵌入到代码中,缺点造成编译后代码体积很大

推荐使用:
开发环境: cheap-module-eval-source-map
生产环境: cheap-module-source-map

以上就是webpack开发环境的配置,可以在内存中自动打包所有类型文件并有自动编译运行、热更新等功能。

准备生产环境

创建文件夹config

将webpack.config.js复制两份

  • ./config/webpack.dev.js
  • ./config/webpack.prod.js
  • 修改webpack.prod.js配置,删除webpack-dev-server配置
  // / 代表根路径(等价于这个:http://localhost:5000/),以后项目上线所有路径都以当前网址为根路径出发module.exports = {output: {path: resolve(__dirname, '../build'), // 文件输出目录filename: './js/built.js', // 文件输出名称publicPath: '/'  // 所有输出资源在引入时的公共路径,若loader中也指定了publicPath,会以loader的为准。},module: {rules: [{test: /\.(png|jpg|gif)$/,use: {loader: 'url-loader',options: {limit: 8192, outputPath: 'images', publicPath: '/images',  // 重写publicPath,需要在路径前面加上 /name: '[hash:8].[ext]' }}},	]},mode: 'production',  //修改为生产环境devtool: 'cheap-module-source-map' // 修改为生产环境的错误提示// 删除devServer}

修改package.json的指令
“start”: “webpack-dev-server --config ./config/webpack.dev.js”
“dev”: “webpack-dev-server --config ./config/webpack.dev.js”
“build”: “webpack --config ./config/webpack.prod.js”

开发环境指令

npm start
npm run dev

生产环境指令

npm run build

注意: 生产环境代码需要部署到服务器上才能运行 (serve这个库能帮助我们快速搭建一个静态资源服务器)

npm i serve -g  
serve -s build -p 5000

清除打包文件目录

概述:
每次打包生成了文件,都需要手动删除,引入插件帮助我们自动删除上一次的文件
安装插件

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

引入插件

const { CleanWebpackPlugin } = require('clean-webpack-plugin');// 注意要解构赋值!!!

配置插件

new CleanWebpackPlugin() // 自动清除output.path目录下的文件

运行指令: npm run build

提取css成单独文件

安装插件
npm install mini-css-extract-plugin --save-dev

引入插件
const MiniCssExtractPlugin = require(“mini-css-extract-plugin”);

配置loader

  {test: /\.less$/,use: [MiniCssExtractPlugin.loader,'css-loader','less-loader',]}

配置插件

  new MiniCssExtractPlugin({filename: "css/[name].css",})

运行指令

npm run build
serve -s build

添加css兼容

安装loader

npm install postcss-loader postcss-flexbugs-fixes postcss-preset-env  postcss-normalize autoprefixer --save-dev 

配置loader

  {test: /\.less$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: () => [require('postcss-flexbugs-fixes'),require('postcss-preset-env')({autoprefixer: {flexbox: 'no-2009',},stage: 3,}),require('postcss-normalize')(),],sourceMap: true,},},'less-loader',]}

添加配置文件: .browserslistrc

	last 1 version> 1%IE 10 # sorry

运行指令:

npm run build
serve -s build

压缩css

安装插件

npm install optimize-css-assets-webpack-plugin --save-dev 

引入插件

const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');	

配置插件

 new OptimizeCssAssetsPlugin({cssProcessorPluginOptions: {preset: ['default', { discardComments: { removeAll: true } }],},cssProcessorOptions: { // 解决没有source map问题map: {inline: false,annotation: true,}}})

运行指令:

npm run build
serve -s build 

压缩html

修改插件配置

  new HtmlWebpackPlugin({template: './src/index.html',minify: {removeComments: true,collapseWhitespace: true,removeRedundantAttributes: true,useShortDoctype: true,removeEmptyAttributes: true,removeStyleLinkTypeAttributes: true,keepClosingSlash: true,minifyJS: true,minifyCSS: true,minifyURLs: true,}})

运行指令:

npm run build
serve -s dist 

以上就是webpack生产环境的配置,可以生成打包后的文件。

本期推荐

最近几年Vue越来越火热,BAT等互联网大厂都在前端职位招聘中加入了精通Vue.js框架的要求,就连饿了么公司的技术团队也专门为Vue.js设计了UI框架体系。本书的实操案例都是笔者独立完成的实际项目,有着对标市场实际需求的参考价值,同时本书提供的框架模式可以让读者应用于其他项目,从而提高开发效率,减少开发弯路。

在这里插入图片描述
本书从Vue.js框架技术的基础概念出发,逐步深入Vue.js进阶实战,并在最后配合一个网站项目和一个后台系统开发实战案例,重点介绍了使用Vue.js+axios+ElementUI+wangEditor进行前端开发和使用组件进行Vue单页面网页复用,让读者不但可以系统地学习Vue.js前端开发框架的相关知识,而且还能对业务逻辑的分析思路、实际应用开发有更为深入的理解。
本书语言平实,用词诙谐,案例丰富,实用性强,特别适合刚入社会的职场新人、Vue.js框架的初级读者和进阶读者阅读,也适合希望从后台开发转型做前端的程序员等其他编程爱好者阅读。另外,本书也适合作为相关培训机构的教材使用。

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

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

相关文章

php单例型(singleton pattern)

搞定&#xff0c;吃饭 <?php /* The purpose of singleton pattern is to restrict instantiation of class to a single object. It is implemented by creating a method within the class that creates a new instance of that class if one does not exist. If an obje…

助你提高效率的几个Vue指令

前言 很多使用Vue的同学往往最容易忽略的指令&#xff0c;由于在这里考虑到很多初学甚至还没有开始接触Vue的同学呢&#xff0c;在介绍v-clos之前呢就先以大家都熟知的v-model编写小demo v-model 相信大家对v-model并不陌生&#xff0c;简单来讲他就是用于在表单控件以及组建…

掌握Mock摆脱后端同学的束缚

文章目录前言Mock概述mock.js安装Mock规范Mock的使用总结前言 当下采用前后端分离模式开发Web应用已经成为气候&#xff0c;在开发阶段有一个不成文的规定则是 项目开发后端先行 但是作为前端开发工程师的我们&#xff0c;难道在搭建完页面后只能等待后端的接口么&#xff1f;…

Vue技能树上线啦

前言 前端现在越来越多样化&#xff0c;语言众多&#xff0c;大家使用的框架也比较杂&#xff0c;在广泛的前端技术栈面前我唯爱Vue&#xff08;仅代表个人观点勿喷小伙伴们&#xff09;可能很多人觉得我是因为简单&#xff0c;其实并不然&#xff0c;我尝试过很多框架&#x…

《SpringMVC从入门到放肆》一、概述

一、SpringMVC概述 ViewServiceDaoDBSpring MVCinterfaceinterfaceMysqlimplsimplsSpringMVC也叫Spring web mvc&#xff0c;属于表现层框架。SpringMVC是Spring框架的一部分&#xff0c;是在Spring3.0后发布的。 二、第一个SpringMVC程序功能描述&#xff1a;  用户提交一个…

手握流量密码,万粉不是梦

前言 可能大家来到CSDN的目的初衷都是不一样的&#xff0c;像我注册CSDN的时候完全是为了解决自己项目中的各种问题&#xff0c;能够有一个为我提供正确答案、正确解决方案的一个平台&#xff0c;简单的了解后我选择CSDN&#xff0c;直到成为现在的创作者也说明我的选择是对的…

秋季学期学习总结

转载于:https://www.cnblogs.com/zx666/p/10408950.html

一文带你了解React框架

前言 由于 React的设计思想极其独特&#xff0c;属于革命性创新&#xff0c;性能出众&#xff0c;代码逻辑却非常简单。所以&#xff0c;越来越多的人开始关注和使用&#xff0c;认为它可能是将来 Web 开发的主流工具。 这个项目本身也越滚越大&#xff0c;从最早的UI引擎变成…

Web前端JQuery面试题(一)

Web前端JQuery面试题&#xff08;一&#xff09; 一&#xff1a;选择器 基本选择器 什么是#id&#xff0c;element&#xff0c;.class&#xff0c;*&#xff0c;selector1, selector2, selectorN&#xff1f;答&#xff1a; 根据给定的id匹配一个元素&#xff0c;用于搜索&…

前端云原生——微信小程序云服务配置

前端同样涉及云原生前言创建使用云开发项目搭建云环境测试云服务1. 获取openid&#xff08;上传本地login云函数&#xff09;1.1 创建部署login文件时报错2. 自定义sum函数并创建部署3. 上传图片4. 前端操作数据库5. 即时通信demo面试法宝欢迎各位小伙伴们&#xff01; 为大家推…

45天带你玩转Node(第一天)初探Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

【转载】 安卓版手机微信如何清理微信空间

在手机微信的使用过程中&#xff0c;随着手机微信使用的时间越长&#xff0c;手机微信占用的空间越大&#xff0c;其实手机微信存储了很多聊天记录包括图片、视频等大文件信息&#xff0c;此时如果手机存储空间比较紧张&#xff0c;可以使用微信自带的清理工具对手机微信空间进…

45天带你玩转Node(第二天)走进Node.js

45天带你玩转Node 粉丝要求博主系统的写一篇关于Node.js的学习资料&#xff0c;但其实我们的Node.js知识点并不少&#xff0c;所以博主为大家搭建了一个专栏&#xff0c;为了方便大家系统的学习Node.js&#xff0c;大家记得订阅哦&#xff01;虽然我们的Node.js还很年轻&#…

深入Vue原理_数据响应式

欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 数据响应式响应式是什么如何实现数据响…

python scipy样条插值函数大全(interpolate里interpld函数)

scipy样条插值 scipy样条插值1、样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法。插值样条是由一些多项式组成的&#xff0c;每一个多项式都是由相邻的两个数据点决定的&#xff0c;这样&#xff0c;任意的两个相邻的多项式以及它们的导数(不包括仇阶导…

EKS独领风骚

前言 随着公司的逐渐发展&#xff0c;开拓了更加多的子项目与小程序&#xff0c;这些都需要进行宣传&#xff0c;但是管理以及部署新的应用是一个繁琐的工程&#xff0c;部署麻烦而且更新业务的时候非常不方面。尤其面向用户的时候&#xff0c;体验感很差。于是想要使用docker…

Linux进程管理之ps的使用

主题Linux进程管理之ps工具的使用 一ps工具的介绍 ps: process state 进程状态ps - report a snapshot of the current processesLinux系统各进程的相关信息均保存在/proc/PID目录下的各文件中 默认显示的内容很少 [rootcentos65 ~]# psPID TTY TIME CMD2018 pts/0 …

openstack Q版部署-----安装报错问题

1、实例开机提示找不到磁盘Booting from Hard Disk... GRUB. 开启 CPU 虚拟化支持。 将计算节点 nova.conf 配置修改如下即可&#xff1a; [libvirt] cpu_mode none virt_type qemu重启服务 systemctl restart libvirtd.service openstack-nova-compute.service 2、错误: 超过…

深入Vue原理_双向数据绑定(视图/数据)

欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 文章目录数据的变化反应到视图命令式操…

大厂直通车【C认证】踵磅来袭

欢迎各位小伙伴们&#xff01; 首先为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 你还在以为CSDN仅仅是一个简简单单…