其他分享
首页 > 其他分享> > webpack4.0详细 从0到1

webpack4.0详细 从0到1

作者:互联网

什么是webpack,模块打包机,功能就是通过入口将所有得依赖关系打包成静态资源。

功能:
1.实现代码得转换(es6转es5,css转换)
2.文件优化(压缩代码体积,合并文件等)
3.代码分割(公共模块得抽离,路由懒加载)
4.模块合并(功能分类合并模块)
5.自动刷新(热更新)
6.代码校验
7.打包后自动发布

1.Webpack 安装(找一个空文件夹)

1、npm init -y(也可以不加y)后面添加 -y参数,帮助我们自动进行确认,直接生成项目
2、npm install webpack@4.0.0 webpack-cli -D
注:这里不推荐全局安装,全局和局部都装了得话,webpack命令会使用全局得得webpack,而npm使用得是局部得webpack,这就有可能导致构建失败
2.1、我安装得时候出现了问题npx webpack -v 没反应也没报错,可以分布装
npm install webpack@4.0.0 -g
npm install webpack-cli -D
在这里插入图片描述

2.打包指令npx webpack
npx webpack 执行得是modules中.bin文件夹下得webpack.cmd
在这里插入图片描述
当前文件夹下插好node.exe,如果不存在,就执行…\webpack\bin\webpack.js
查看webpack.js中会发现必须依赖于webpack-cli,所以得安装!
在这里插入图片描述
接下来,我们创建一个src文件夹,里面创建index.js,里面随便输入,执行npx webpack,会发现打包到dist文件夹中了

3.webpack得基础配置webpack.config.js。默认得是0配置比较弱

注意:如果要改名改成其他得 abc.js,
1.打包执行npx webpack --config abc.js
2.写个脚本,在package.json 中加入
“scripts”: {
“build”: “webpack --config webpack.config.js”
},然后运行npm run build

let path=require("path");       //内置模块,相对路径解析成绝对路径
module.exports={
    mode:"development",    //模式默认两种  production 开发  development(代码不压缩) 
    entry:"./src/index.js",    //入口
    output:{
        filename:"bundle.js",   //打包后得文件名
        path:path.resolve(__dirname,'dist'),        //路径必须是绝对路径,__dirname当前目录下,不加也可以
    }
}

4.webpack-dev-server 服务 npm i webpack-dev-serve -g
这是一个小型node.js express服务器,用来实现一个静态服务

2个功能
1.自定刷新inline 和 iframe
2.自动打包(打包在内存中)

写入脚本

package.json
"scripts": {
    "serve": "webpack-dev-server"
  },

在这里插入图片描述
注意:webpack webpack-cli webpack-dev-server得版本会有冲突,下面是我用得
在这里插入图片描述
接下来npm run serve 成功
在这里插入图片描述
配置webpack-dev-server

webpack-config.js
// 开发服务得配置 webpack-dev-serve
    devServer: {
        prot: "4000", //端口号
        progress: true, //进度条
        contentBase: path.resolve(__dirname, "dist"), //指向这个目录
        compress: true, //自动打开浏览器
    },

5.增加html模板 html-webpack-plugin
上术操作下来,打包后是没有index.html得。

安装插件:npm i html-webpack-plugin -D
功能:1.创建生成入口文件html
2.生成哈希值防止缓存

webpack-config.js
// 插件
顶部引入 let HtmlWebpackPlugin = require("html-webpack-plugin");
    plugins: [
        // html 模板 pub 静态资源文件夹,打包后自动根据pub/index.html,生成indexxxxx.html在dist中
        new HtmlWebpackPlugin({
            template: "./pub/index.html",
            filename: "indexxxx.html",
            // 打包后得html 也压缩
            minify: {
                removeAttributeQuotes: true, //删除html中得双引号
                collapseWhitespace: true, //折成一行
            },
            hash: true, //哈希值
        }),
    ],
    哈希值还有一种也可以[hash:8] 长度 
    output: {
        filename: "bundle[hash].js", //打包后得文件名  加上这个[hash]  产生一个哈希值
        path: path.resolve(__dirname, "dist"), //路径必须是绝对路径,__dirname当前目录下,不加也可以
    },

在这里插入图片描述
6.样式处理,解析css less模块
webpack默认只支持加载js模块,现在需要引入样式。需要用到loader加载器

src下创建

index.css
@import "./c.css";
body{
    background: red;
}
c.sss
body{
    font-size: 30px;
}
le.less
body{
    background: yellow !important;
    div{
		transform: rotate(50deg);
	}
}
index.js
require("./index.css");

接下来安装style-loader css-loader

npm i style-loader -D 将css写入到html
npm i css-loader -D 解析@import等语句
npm i less-loader -D 解析less==》css
npm i mini-css-extract-plugin -D css外链

配置文件,loader得顺序是右往左

// 模块加载
   module: {
        // loader 模块转换器
        rules: [
            //规则 css-loader 解析@important这种语法
            //style-loader 把css插入到head得标签中(也可以是底部)
            // less-loader 解析less成css
            // loader 特点单一,use使用字符串单个, 多个得话写成数组["style-loader", "css-loader"]。loader得顺序是右往左,从下往上
            // loader还可以写成对象方式
            {
                test: /\.css$/,
                use: [
                    // {
                    //     loader: "style-loader",
                    //     options: {
                    //         // insertAt: "top", //css打包之后在顶部 默认在底部
                    //     },
                    // },
                     MiniCssExtractPlugin.loader,
                    "css-loader",
                ],
            },
            // 处理less  sass stylus...
            {
                test: /\.less$/,
                use: [
                    // {
                    //     loader: "style-loader",
                    //     options: {
                    //         // insertAt: "top", //css打包之后在顶部 默认在底部
                    //     },
                    // },
                     MiniCssExtractPlugin.loader,
                    "css-loader",
                    "less-loader",
                ],
            },
        ],
    },

效果
在这里插入图片描述

自动兼容样式插件autoprefixer和postcss-loader

npm i autoprefixer postcss-loader -D

配置文件

rules: [
            //规则 css-loader 解析@important这种语法
            //style-loader 把css插入到head得标签中(也可以是底部)
            // less-loader 解析less成css
            // loader 特点单一,use使用字符串单个, 多个得话写成数组["style-loader", "css-loader"]。loader得顺序是右往左
            // loader还可以写成对象方式
            {
                test: /\.css$/,
                use: [
                    // {
                    //     loader: "style-loader",
                    //     options: {
                    //         insertAt: "top", //css打包之后在顶部 默认在底部
                    //     },
                    // },
                    MiniCssExtractPlugin.loader,
                    "css-loader",
                    "postcss-loader",	//放在css加载之前
                ],
            },
            // 处理less  sass stylus...
            {
                test: /\.less$/,
                use: [
                    // {
                    //     loader: "style-loader",
                    //     options: {
                    //         // insertAt: "top", //css打包之后在顶部 默认在底部
                    //     },
                    // },
                    MiniCssExtractPlugin.loader,
                    "css-loader",
                    "postcss-loader",
                    "less-loader",
                ],
            },
        ],

需要外面有个配置文件,根目录下新建postcss.config.js

module.exports = {
    plugins: {
        autoprefixer: {
            overrideBrowserslist: [
                "Android 4.1",
                "iOS 7.1",
                "Chrome > 31",
                "ff > 31",
                "ie >= 8", //'last 2 versions', // 所有主流浏览器最近2个版本
            ],
            // grid: true,
        },
    },
};

压缩CSS,插件optimize-css-assets-webpack-plugin 用了这个插件js也必须用插件压缩

npm i optimize-css-assets-webpack-plugin uglifyjs-webpack-plugin -D

配置文件

// 优化项
    optimization: {
        minimizer: [
            new OptimizeCssAssetsWebpackPlugin(), //css压缩 用了这个插件之后js 压缩也必须要插件 uglifyjs-webpack-plugin
            new UglifyjsWebpackPlugin({
                cache: true, //是否用缓存
                parallel: true, //是否并发打包,可以打包多个
                sourceMap: false,
            }),
        ],
    },

7.js语法转换
装得插件比较多,核心是babel 官网https://www.babeljs.cn/,插件可以在上面找

babel-loader
------------------es6转换----------------------
@babel/core
@babel/preset-env
------------------class转换---------------------
@babel/plugin-proposal-class-properties
--------------------语法 @log 装饰器 转换--------------------------
@babel/plugin-proposal-decorators
-------------------可以转换异步得语法,比如promise,----------------------------
@babel/plugin-transform-runtime
@babel/runtime
-------------------可以转换es7语法,比如includes, 全局引入require("@babel/polyfill");----------------------------
@babel/polyfill

配置 ----------------------------include: path.resolve(__dirname, “src”), //只在src下找

module{
	rules:{
		// js语法转换
            {
                test: /\.js$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        // 插件库,预设
                        presets: [
                            "@babel/preset-env", //js es6语法转换
                        ],
                        plugins: [
                            [
                                "@babel/plugin-proposal-decorators",
                                { legacy: true },
                            ], //语法 @log 装饰器 转换
                            "@babel/plugin-proposal-class-properties",//转换 class   es7语法使用@babel/polyfill,全局require
                            "@babel/plugin-transform-runtime", //可以转换异步得语法,比如promise, 做了简单得优化,比如抽离公共得部分
                        ],
                    },
                     include: path.resolve(__dirname, "src"), //只在src下找
               		 // exclude:/node_modules/,             //排除。。。。
                },
            },
	}
}

8.elint配置验证js得语法

配置插件
npm i eslint eslint-loader -D

配置文件

// 模块加载
    module: {
        // loader 模块加载器
        rules: [
			 {
                test: /\.js$/,
                use: {
                    loader: "eslint-loader",
                    options: {
                        enforce: "pre", // 强制previous优先执行 post之后执行  保证在js转换之前执行
                    },
                },
            },
		]
}

创建 .eslintrc.json 内容可以网上有,官网上可以去下载demo,不过下载下来得文件前面少个.,然后放根目录下
https://eslint.bootcss.com/demo/
在这里插入图片描述
9,第三方插件得引入

方式三种:

1.import xxxx from ‘’

npm 下载插件, 最后会打包进我们得包里面,js体积会比较大

2.配置文件 使用webpack注入插件,可以使用cdn加速,也可Npm下载包 这里会将插件打包进来

webpack.config.js
顶部 引入webpack插件 用来注入我们得第三方插件
let webpack = require("webpack"); //注入插件
module.exports = {
	plugins: [
		new webpack.ProvidePlugin({
            //每个模块注入  可以使用cdn加速,也可Npm下载包 这里会将插件打包进来
            $: "jquery",
        }),
	]
}

3.推荐:externals 忽略第三方插件,不会打包到我们最后得包中,必须配合cdn使用

module.exports = {
	externals: {
        jquery: "$",
    },
}

这种方式为了防止cdn不稳定,可以做一个兼容,在静态文件夹得index.html中做个判断,下面以vue举例:如果cdn挂了,可以动态得添加一个script标签,地址是自己服务器上得资源(得提前在服务器上备份,或者可以自己公司整一个npm库)

<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script> 
     <script>
       //防止cnd不稳定
         if(typeof Vue == 'undefined'){
           document.write('<script src="http://www.u-breath.com/modules/_vue@2.6.10@vue/dist/vue.min.js"><\/script>')
         }
     </script>

10.图片得处理
3种图片方式

1.css种背景图片得方式,css-loader会直接帮你转成require()得形式

2.js种 new Image()

import mya from “./my.jpg”;
let img = new Image();
img.src = mya;
document.getElementById(“img”).append(img);

需要url-loader拉解析import 引入得图片

npm i url-loader -D
允许你有条件地将文件转换为内联的 base-64 URL (当文件小于给定的阈值),这会减少小文件的 HTTP 请求数。如果文件大于该阈值,会自动的交给 file-loader 处理

// 图片解析加载 匹配js中得
rules:
            {
                test: /\png|jpe?g|gif$/,
                use: {
                    loader: "url-loader",
                    options: {
                        limit: 1000 * 1024, //小于xxxk 解析成base64 大于正常产出图片
                    },
                },
            },

3.img在html中使用
img src="…/src/my.jpg"

loader:html-withimg-loader
npm i html-withimg-loader -D

rules:
// 图片解析加载 匹配html中得
            {
                test: /\.html$/,
                use: {
                    loader: "html-withimg-loader",
                },
            },

11.打包文件分类

css  之前使用插件MiniCssExtractPlugin 外链了css可以改下他得filename
plugins:[
	new MiniCssExtractPlugin({
            filename: "/css/main.css", //外链得css名
        }),
]
img  在url-loader里面可以指定文件夹 ,还能给图片加上绝对路径
{
   test: /\png|jpe?g|gif$/,
     use: {
         loader: "url-loader",
         options: {
             limit: 10 * 1024, //小于10k 解析成base64 大于正常产出图片
             outputPath: "/img/",
             // publicPath:"http://xxxxxxxxxxxxxxx"   图片加上绝对路径,比如说图片全部采用得是cdn
         },
     },
 },
 

效果
在这里插入图片描述
12.多入口配置
创建两个js:a.js b.js

配置文件:利用HtmlWebpackPlugin中得chunks属性输出加载对应得js

// 多入口
    entry: {
        home: "./src/a.js",
        other: "./src/b.js",
    },
    // 多出口
    output: {
        filename: "[name].js", //打包后得文件名  加上这个bundle[hash].js  产生一个哈希值
        path: path.resolve(__dirname, "dist"), //路径必须是绝对路径,__dirname当前目录下,不加也可以
    },
    plugins:[
	// html 模板 pub 静态资源文件夹,打包后自动根据pub/index.html,生成indexxxxx.html在dist中
        new HtmlWebpackPlugin({
            template: "./pub/index.html",
            filename: "indexxxx.html",
            // 打包后得html 也压缩
            // minify: {
            //     removeAttributeQuotes: true, //删除html中得双引号
            //     collapseWhitespace: true, //折成一行
            // },
            chunks: ["home"],
            minify: false,
            hash: true, //哈希值
        }),
        // html 模板 pub 静态资源文件夹,打包后自动根据pub/index.html,生成indexxxxx.html在dist中
        new HtmlWebpackPlugin({
            template: "./pub/index.html",
            filename: "indexxxx1.html",
            // 打包后得html 也压缩
            // minify: {
            //     removeAttributeQuotes: true, //删除html中得双引号
            //     collapseWhitespace: true, //折成一行
            // },
            chunks: ["home", "other"],
            minify: false,
            hash: true, //哈希值
        }),
	]

13.devtool 配置报错提示,找到对应的位置
配置文件webpack.config.js

4种值
source-map //增加映射文件,帮助我们调试代码 出错会标出具体位置,包中会多出以.map结尾得文件 显示的是原始源代码
eval-source-map 也能帮助我们调试代码,集成到打包得js中 包裹代码
cheap-module-source-map 不会产生列,但是是一个单独得映射文件 产生后可以保留起来调试 显示的是转换后的代码
cheap-module-eval-source-map不会产生文件,集成在打包后的文件中,不会产生列

devtool: "cheap-module-eval-source-map",

在这里插入图片描述

14.继续学习中

标签:插件,js,webpack,html,详细,webpack4.0,loader,css
来源: https://blog.csdn.net/qq_38935512/article/details/112517327