马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Webpack 基础
根本使用
webpack是一个静态资源打包工具。
它会将一个或者多个文件作为打包的入口,将我们整个项目全部文件编译组合成一个或者多个文件输出出去。
输出的文件就是编译好的文件,就可以在浏览器端运行。
我们将webpack输出的文件叫做bundle。
功能先容
webpack自己功能是有限的:
- 开发模式:仅能编译JS中的ES Module语法。
- 生产模式:能编译JS中的ES Module语法,还能压缩JS代码。
开始使用
1.资源目录
- webpack_code # 项目根目录(所有指令必须在这个目录中运行)
- └── src # 项目源码目录
- |──js # js目录
- | |—— count.js
- | └── sum.js
- └── main.js # 项目主文件
复制代码 2.创建文件
- export default function count(x,y){
- return x + y;
- }
复制代码
- export default function sum(...args){
- return args.reduce((pre,cur)=> pre + cur,0)
- }
复制代码
- import count from "./js/count"
- import sum form "./js/sum"
- console.log(count(2,1))
- console.log(count(1,2,3,4,5))
复制代码 3.下载依赖
打开终端,在项目根目录下实行指令
- npm i webpack webpack-cli -D
复制代码 4.启用webpack
- npx webpack ./src/main.js --mode=development
复制代码
- npx webpack ./src/main.js --mode=production
复制代码 npx webpack:是用来运行本地安装webpack包的。
./src/main.js:指定webpack从main.js文件开始打包,不但会打包main.js,还会将其他依赖也一起打包进来。
--mode=production:指定模式(环境)。
5.观察输出文件
默认webpack会将文件打包输出到dist目录下。
webpack自己功能比力少,只能处理js资源,一旦遇到css等其他资源就会报错。
全部我们学习webpack,就是主要学习怎样处理其他资源。
根本配置
在开始使用webpack之前,我们需要对webpack的配置有肯定的认识。
五大核心概念
指示 webpack 从哪个文件开始打包。
指示 webpack 打包完的文件输出到哪里去,怎样定名。
webpack 自己只能处理js、json等资源,其他资源需要借助loader,webpack 才能解析。
扩展 webpack 功能。
主要有两种开发模式:
- 开发模式:development
- 生产模式:producton
webpack 配置文件
webpack.config.js
- const path = require("path")
- module.exports = {
- //入口
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件的输出路径
- path: path.resolve(__dirname, "dist"),
- filename: "main.js"
- },
- // 加载器
- module: {
- rules: []
- },
- // 插件
- plugins: [],
- // 模式
- mode: "development"
- }
复制代码 开发模式
开发模式顾名思义就是我们开发代码时使用的模式。
这个模式下我们主要做两件事:
开发时我们有样式资源、字体图标、图片资源、html资源等,webpack默认都不能处理这些资源,以是我们要加载配置来编译这些资源。
提前检查代码的一些隐患,让代码运行时能更加健壮。
提前检查代码规范和格式,同一团队编码风格,让代码更优雅美观。
处理样式资源
学习使用webpack处理Css、Less、Sass、Styl样式资源
先容
webpack 自己是不能识别样式资源的,以是我们需要借助Loader来帮助webpack解析样式资源。
需要的Loader都应该去官方文档中查找对应的Loader。
webpack 官方Loader文档
处理CSS资源
- npm i css-loader style-loader -D
复制代码 需要下载两个Loader
- 功能先容
- css-loader:负责将CSS文件编译成webpack能识别的模块。
- style-loader:会动态创建一个style标签,内里放置webpack中的CSS模块内容。
- 配置
- module: {
- // loader的配置
- rules: [{
- test: /\.css$/,
- use: [
- // 执行的顺序,从右到左(从上到下)
- "style-loader", // 将js中css通过创建style标签添加html文件中生效
- "css-loader" // 将样式编译成commonjs的模块
- ]
- }]
- },
复制代码 处理less文件
- 功能先容
less-loader:负责将less文件编译成CSS文件
- 配置
- module: {
- // loader的配置
- rules: [ {
- test: /\.less$/,
- // loader:'xxx'只能使用单个loader
- // user 使用多个loader
- use: [
- "style-loader",
- "css-loader",
- "less-loader" // 将Less 编译成css文件
- ]
- }]
- },
复制代码 处理Sass和Scss资源
- npm i sass-loader sass -D
复制代码 注意:需要下载两个
- 功能先容
- sass-loader:负责将Sass文件编译成Css文件。
- sass:sass-loader依赖sass进行编译。
- 配置
- module: {
- // loader的配置
- rules: [{
- test: /\.s[ac]ss$/,
- use: [
- "style-loader",
- "css-loader",
- "sass-loader"
- ]
- }]
- },
复制代码 处理styl资源
- 功能先容
- stylus-loader:负责将Styl文件编译成Css文件。
- 配置
- module: {
- // loader的配置
- rules: [{
- test: /\.styl$/,
- use: [
- "style-loader",
- "css-loader",
- "stylus-loader"
- ]
- }]
- },
复制代码 处理图片资源
webpack4 时,我们处理图片资源通过file-loader和url-loader进行处理。
如今webpack已经将两个Loader功能内置到webpack
- module: {
- // loader的配置
- rules: [{
- test: /\.(png|jpe?g|gif|webp)$/,
- type: "asset",
- parser: {
- dataUrlCondition: {
- // 小于 10 kb 转base64
- // 优点:减少请求数量,缺点:打包后的结果体积增大
- maxSize: 20 * 1024,
- }
- },
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/images/[hash:10][ext][query]"
- }
- }]
- },
复制代码 自动清空打包内容
- output: {
- // 文件的输出路径
- path: path.resolve(__dirname, "dist"),
- filename: "js/main.js",
- clean: true
- },
复制代码 处理字体图标资源
- @font-face {
- font-family: "HY";
- src: url("../fonts/HanYiXingKaiJian-1.ttf");
- }
复制代码- div {
- font-family: "HY";
- }
复制代码
- modules:{
- test: /\.ttf|worff?$/,
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/font/[hash:10][ext][query]"
- }
- }
复制代码 处理其他资源
如遇到 音视频文件、文本文档等,我们将这些资源打包输出到dist目录中。
- {
- test: /\.video|audio|xsl|doc$/,
- generator: {
- filename: "static/media/[hash:10][ext][query]"
- }
- }
复制代码 处理JS资源
webpack对JS处理是有限的,只能编译JS中的模块化语法,不能编译其他语法,导致JS不能在IE等浏览器运行,以是我们希望做一些兼容性处理。
其次,在开发中团队对代码格式是有严格要求的,我们不能由肉眼去检测代码格式,需要使用专业工具来检测。
- 针对JS兼容性处理,我们手机用Babel做代码兼容处理。
- 针对代码格式,我们使用ESlint来完成。
先使用 ESlint 做代码检查,然后再使用Babel做代码兼容性处理。
ESlint
可组装的JavaScript和JSX检查工具。
使用ESlint关键是使用它的配置文件,内里写的各种rule规则,将来运行ESlint时就会以写的规则对代码进行检查。
配置文件
配置文件有许多种写法:
- .eslintrc:新建文件,位于项目根目录
- .eslintrc
- .eslintrc.js
- .eslintrc.json
- package.json 中 eslintConfig不需要配置文件,在原有的文件基础上写。
ESlint 会查找和自动读取它们,以是以上配置文件只需要存在一个即可。
具体配置
我们以 .eslintrc.js 配置文件为例:
- module.exports = {
- // 解析选项
- parserOptions:{},
- // 具体检查规则
- rules:{},
- // 继承其他规则
- extends:[],
- }
复制代码 ESlint 规则
- {
- parserOptions:{
- ecmaVersion: 6 // ES 语法版本
- sourceType: "module" // ES 模块化
- ecmaFeatures:{
- // ES 其他特性
- // 如果是 react 项目 需要开启
- jsx:true
- }
- }
- }
复制代码
- rule规则
- off或0 - 关闭规则
- warn或1 - 开启规则,使用告诫级别的错误:warn(不会导致程序退出)。
- error或2 - 开启规则,使用错误级别的错误:error(当被触发的时候,程序会退出)。
- {
- rules:{
- semi:"error", // 禁止使用分号
- 'array-callback-return':'warn', // 强制数组的回调函数中有 return 语句,否则警告。
- 'default-case':[
- 'warn', // 要求 switch 语句中有 default分支,否则警告
- {
- commentPattern:'^no default$' // 允许在最后注释:no default ,就不会有警告。
- }
- ],
- eqeqeq:[
- 'warn', // 强制使用 === 和 !==,否则警告。
- 'smart' //
- ]
- }
- }
复制代码
- extends 继承
开发中一点点写rules规则太费劲,以是有更好的办法,继承现有的规则。
现有如下较为有名的规则:
- Eslint官方规则:eslint:recommended
- Vue Cli官方规则:plugin:vue/essential
- React Cli官方规则:reat-app
- {
- extends:["react-app"],
- rules:{
- // 我们的规则会覆盖掉react-app的规则
- // 所以想要修改规则直接改就行
- eqeqeq:["warn","smart"]
- }
- }
复制代码 在webpack中使用
- npm i eslint-webpack-plugin eslint -D
复制代码
- 定义Eslint配置文件
- import globals from "globals";
- import pluginJs from "@eslint/js";
- import pluginVue from "eslint-plugin-vue";
- /** @type {import('eslint').Linter.Config[]} */
- export default [
- { files: ["**/*.{js,mjs,cjs,vue}"] },
- { languageOptions: { globals: globals.browser } },
- pluginJs.configs.recommended,
- ...pluginVue.configs["flat/essential"],
- {
- rules: {
- "no-var": 2 // 不能使用var定义变量
- }
- }, {
- ignorePatterns: ["./config/*", "./dist/*", "*.config.js"]
- }
- ];
复制代码
- 下载插件
- npm init @eslint/config@latest
复制代码
- import globals from "globals";
- import pluginJs from "@eslint/js";
- import pluginVue from "eslint-plugin-vue";
- /** @type {import('eslint').Linter.Config[]} */
- export default [
- { files: ["**/*.{js,mjs,cjs,vue}"] },
- { languageOptions: { globals: globals.browser } },
- pluginJs.configs.recommended,
- ...pluginVue.configs["flat/essential"],
- {
- rules: {
- "no-var": 2 // 不能使用var定义变量
- }
- }, {
- ignores: ["webpack.config.js", "dist/"]
- }
- ];
复制代码
- {
- plugins: [
- new ESLintPlugin({
- context: path.resolve(__dirname, "src")
- })
- ],
- }
复制代码 Babel
JavaScript 编译器。
主要用于将 ES6 语法编写的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或者其他环境中。
配置文件
配置文件有许多种写法:
- babel.config.*:新建文件,位于项目根目录。
- babel.config.js
- babel.config.json
- .babelrc.*:新建文件,位于项目根目录。
- .babelrc
- babelrc.js
- bablerc.json
- package.json中babel:不需要创建文件,在原有文件基础上写。
Babel 会查找和自动读取它们,以是以上配置文件只需要存在一个即可。
具体配置
我们babel.config.js配置文件为例:
- module.exports = {
- // 预设
- presets:[]
- }
复制代码
- presets预设
简单明白:就是一组Babel插件,扩展Babel功能。
- @babel/preset-env:智能预设,答应使用最新JavaScript。
- @babel/preset-react:用来编译React jsx 语法预设。
- @babel/preset-typescript:用来编译TypeScript语法的预设。
webpack中的使用
- npm i babel-loader @babel/core @babel/preset-env -D
复制代码
- 定义Babel配置文件
创建文件 babel.config.js
- module.exports = {
- // 智能预设,编译es6语法
- presets: ["@babel/preset-env"]
- }
复制代码
- {
- module:{
- test: /\.js$/,
- // 排除node_modules中的js文件(这些文件不处理)
- exclude: /node_modules/,
- loader: "babel-loader"
- }
- }
复制代码 处理Html资源
下载包
- npm i html-webpack-plugin -D
复制代码 配置
- {
- plugins:[
- new htmlWebpackPlugin({
- template:path.resolve(__dirname,"public/html")
- })
- ]
- }
复制代码 开发服务器&自动化
自动化编译代码
下载包
- npm i webpack-dev-server -D
复制代码 配置
- {
- // 开发服务器不会输出资源,在内存中编译打包的
- devServer: {
- // 启动服务器域名
- host: "localhost",
- port: "3000",
- open: true
- },
- }
复制代码
总结
- const ESLintPlugin = require('eslint-webpack-plugin');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const path = require("path")
- module.exports = {
- //入口
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件的输出路径
- path: path.resolve(__dirname, "dist"),
- filename: "main.js",
- clean: true
- },
- // 加载器
- module: {
- // loader的配置
- rules: [{
- test: /\.css$/,
- use: [
- // 执行的顺序,从右到左(从上到下)
- "style-loader", // 将js中css通过创建style标签添加html文件中生效
- "css-loader" // 将样式编译成commonjs的模块
- ]
- }, {
- test: /\.less$/,
- // loader:'xxx'只能使用单个loader
- // user 使用多个loader
- use: [
- "style-loader",
- "css-loader",
- "less-loader" // 将Less 编译成css文件
- ]
- }, {
- test: /\.s[ac]ss$/,
- use: [
- "style-loader",
- "css-loader",
- "sass-loader"
- ]
- }, {
- test: /\.styl$/,
- use: [
- "style-loader",
- "css-loader",
- "stylus-loader"
- ]
- }, {
- test: /\.(png|jpe?g|gif|webp)$/,
- type: "asset",
- parser: {
- dataUrlCondition: {
- // 小于 10 kb 转base64
- // 优点:减少请求数量,缺点:打包后的结果体积增大
- maxSize: 20 * 1024,
- }
- },
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/images/[hash:10][ext][query]"
- }
- }, {
- test: /\.ttf|worff?$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/font/[hash:10][ext][query]"
- }
- }, {
- test: /\.video|audio|xsl|doc$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/media/[hash:10][ext][query]"
- }
- }, {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: "babel-loader"
- }]
- },
- // 插件
- plugins: [
- new ESLintPlugin({
- context: path.resolve(__dirname, "src")
- }),
- new HtmlWebpackPlugin({
- template: path.resolve(__dirname, "./index.html")
- })
- ],
- devServer: {
- // 启动服务器域名
- host: "localhost",
- port: "3000",
- open: true
- },
- // 模式
- mode: "development"
- }
复制代码 生产环境搭建
- 根目录下创建文件夹config存放文件webpack.dev.js、webpack.prod.js
- const ESLintPlugin = require('eslint-webpack-plugin');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const path = require("path")
- module.exports = {
- //入口
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件的输出路径
- path: undefined,
- filename: "main.js",
- clean: true
- },
- // 加载器
- module: {
- // loader的配置
- rules: [{
- test: /\.css$/,
- use: [
- // 执行的顺序,从右到左(从上到下)
- "style-loader", // 将js中css通过创建style标签添加html文件中生效
- "css-loader" // 将样式编译成commonjs的模块
- ]
- }, {
- test: /\.less$/,
- // loader:'xxx'只能使用单个loader
- // user 使用多个loader
- use: [
- "style-loader",
- "css-loader",
- "less-loader" // 将Less 编译成css文件
- ]
- }, {
- test: /\.s[ac]ss$/,
- use: [
- "style-loader",
- "css-loader",
- "sass-loader"
- ]
- }, {
- test: /\.styl$/,
- use: [
- "style-loader",
- "css-loader",
- "stylus-loader"
- ]
- }, {
- test: /\.(png|jpe?g|gif|webp)$/,
- type: "asset",
- parser: {
- dataUrlCondition: {
- // 小于 10 kb 转base64
- // 优点:减少请求数量,缺点:打包后的结果体积增大
- maxSize: 20 * 1024,
- }
- },
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/images/[hash:10][ext][query]"
- }
- }, {
- test: /\.ttf|worff?$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/font/[hash:10][ext][query]"
- }
- }, {
- test: /\.video|audio|xsl|doc$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/media/[hash:10][ext][query]"
- }
- }, {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: "babel-loader"
- }]
- },
- // 插件
- plugins: [
- new ESLintPlugin({
- context: path.resolve(__dirname, "../src")
- }),
- new HtmlWebpackPlugin({
- template: path.resolve(__dirname, "../index.html")
- })
- ],
- devServer: {
- // 启动服务器域名
- host: "localhost",
- port: "3000",
- open: true
- },
- // 模式
- mode: "development"
- }
复制代码
- const ESLintPlugin = require('eslint-webpack-plugin');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const path = require("path")
- module.exports = {
- //入口
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件的输出路径
- path: path.resolve(__dirname, "dist"),
- filename: "main.js",
- clean: true
- },
- // 加载器
- module: {
- // loader的配置
- rules: [{
- test: /\.css$/,
- use: [
- // 执行的顺序,从右到左(从上到下)
- "style-loader", // 将js中css通过创建style标签添加html文件中生效
- "css-loader" // 将样式编译成commonjs的模块
- ]
- }, {
- test: /\.less$/,
- // loader:'xxx'只能使用单个loader
- // user 使用多个loader
- use: [
- "style-loader",
- "css-loader",
- "less-loader" // 将Less 编译成css文件
- ]
- }, {
- test: /\.s[ac]ss$/,
- use: [
- "style-loader",
- "css-loader",
- "sass-loader"
- ]
- }, {
- test: /\.styl$/,
- use: [
- "style-loader",
- "css-loader",
- "stylus-loader"
- ]
- }, {
- test: /\.(png|jpe?g|gif|webp)$/,
- type: "asset",
- parser: {
- dataUrlCondition: {
- // 小于 10 kb 转base64
- // 优点:减少请求数量,缺点:打包后的结果体积增大
- maxSize: 20 * 1024,
- }
- },
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/images/[hash:10][ext][query]"
- }
- }, {
- test: /\.ttf|worff?$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/font/[hash:10][ext][query]"
- }
- }, {
- test: /\.video|audio|xsl|doc$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/media/[hash:10][ext][query]"
- }
- }, {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: "babel-loader"
- }]
- },
- // 插件
- plugins: [
- new ESLintPlugin({
- context: path.resolve(__dirname, "../src")
- }),
- new HtmlWebpackPlugin({
- template: path.resolve(__dirname, "../index.html")
- })
- ],
- // devServer: {
- // // 启动服务器域名
- // host: "localhost",
- // port: "3000",
- // open: true
- // },
- // 模式
- mode: "production"
- }
复制代码
- {
- "scripts": {
- "dev": "webpack server --config ./config/webpack.dev.js",
- "build": "webpack --config ./config/webpack.prod.js"
- },
- }
复制代码 CSS处理
提取CSS成单独文件
CSS 文件如今是被打包到JS文件中,当JS文件加载时,会创建一个style标签来生成样式。
这样对网站来说,会出现闪屏现象,用户体验不太好。
我们应该将CSS文件提取,通过link标签引入。
- npm i install mini-css-extract-plugin -D
复制代码
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- module.exports = {
- plugins: [new MiniCssExtractPlugin({
- })],
- module: {
- rules: [
- {
- test: /\.css$/i,
- use: [MiniCssExtractPlugin.loader, "css-loader"],
- },
- ],
- },
- };
复制代码 CSS兼容处理
- npm i postcss-loader postcss postcss-preset-env -D
复制代码
- const ESLintPlugin = require('eslint-webpack-plugin');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- const path = require("path")
- function getStyleloader(pre) {
- return [
- MiniCssExtractPlugin.loader,
- "css-loader",
- {
- loader: "postcss-loader",
- options: {
- postcssOptions: {
- plugins: [
- "postcss-preset-env"
- ]
- }
- }
- },
- pre
- ].filter(Boolean)
- }
- module.exports = {
- //入口
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件的输出路径
- path: path.resolve(__dirname, "dist"),
- filename: "main.js",
- clean: true
- },
- // 加载器
- module: {
- // loader的配置
- rules: [{
- test: /\.css$/,
- use: getStyleloader()
- }, {
- test: /\.less$/,
- // loader:'xxx'只能使用单个loader
- // user 使用多个loader
- use: getStyleloader("less-loader")
- }, {
- test: /\.s[ac]ss$/,
- use: getStyleloader("sass-loader")
- }, {
- test: /\.styl$/,
- use: getStyleloader("stylus-loader")
- }, {
- test: /\.(png|jpe?g|gif|webp)$/,
- type: "asset",
- parser: {
- dataUrlCondition: {
- // 小于 10 kb 转base64
- // 优点:减少请求数量,缺点:打包后的结果体积增大
- maxSize: 20 * 1024,
- }
- },
- generator: {
- // 输出图片名称
- // [hash:10] hash 值取前10位
- filename: "static/images/[hash:10][ext][query]"
- }
- }, {
- test: /\.ttf|worff?$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/font/[hash:10][ext][query]"
- }
- }, {
- test: /\.video|audio|xsl|doc$/,
- generator: {
- // [hash:10] hash 值取前10位
- filename: "static/media/[hash:10][ext][query]"
- }
- }, {
- test: /\.js$/,
- exclude: /node_modules/,
- loader: "babel-loader"
- }]
- },
- // 插件
- plugins: [
- new ESLintPlugin({
- context: path.resolve(__dirname, "../src")
- }),
- new HtmlWebpackPlugin({
- template: path.resolve(__dirname, "../index.html")
- }),
- new MiniCssExtractPlugin({
- filename: "static/css/index.css"
- })
- ],
- // devServer: {
- // // 启动服务器域名
- // host: "localhost",
- // port: "3000",
- // open: true
- // },
- // 模式
- mode: "production"
- }
复制代码
- {
- "browserslist": [
- "last 2 version",
- "> 1%",
- "not dead"
- ]
- }
复制代码 CSS压缩
- npm i css-minimizer-webpack-plugin -D
复制代码
- const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
- module.exports = {
- plugins: [
- new CssMinimizerPlugin()
- ],
- }
复制代码 html压缩
默认生产模式已经开启了html压缩和js压缩,不需要额外配置。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |