webapck练习和总结

1 篇文章 0 订阅

第一 webpack 正确安装方式
笔记:
首先安装webpack避免全局安装,应该在当前项目安装,否则会导致版本不一样会发生不一样的错误。
npx webpack -v 查看webpack安装的版本号和webpack-cli
npm info webpack 查看webpack版本号

注意:webpack4.25.1版本 配合webpack-cli3.1.2在npx webpack index.js 打包成功
webpack5.24.2版本在npx webpack index.js 不能打包成功
会出现意外的问题

第二 使用webpack的配置文件

1、 npx webpack 在npx webpack打包的时候,会在文件中找是否有默认文件webpack.config.js文件,如果有就根据默认文件的内容进行打包,自动生成一个静态文件
2、如果文件中没有默认文件类型命名如:webpack.config.js 则 打包方式如下: npx webpack --config 自定义webpack文件名
3、 的mode 有development 和production 一个是开发一个生产,开发模式是不会打包压缩,生产模式是会压缩的

第三 loader是什么?

1、loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理
本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

在更高层面,在 webpack 的配置中 loader 有两个目标
1、test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
2、use 属性,表示进行转换时,应该使用哪个 loader。
onst path = require('path');

const config = {
  output: {
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};

module.exports = config;

第四章 使用loader静态资源打包(图片篇)

使用loader指南 Loader
file-loader

1、url-loader 如果加入limit时,对于小于文件大小限制,会返回成data URL 如果大于文件限制,会在dist文件中生成静态图片。如果不加入limit限制则会直接打包到bundle.js中,但是会有特殊情况,比如图片特别大的时候,会导致bundle文件也特别大,这样会导致http请求时间过长的问题
2、url-loader 通过文件大小限制,对于小的文件,直接打包到dist的bundle.js文件中,这样也进一步减少浏览器http请求,从而释放一些资源!

第四 使用loader静态资源打包(样式篇)

css-loader 要和webpack 版本进行良好兼容,负责打包会出错误,
css-loader 的最新版本(日期: 2021/02/28)(css-loader@5.1.0 )不能兼容 webpack 4+ 的版本
截图如下:
在这里插入图片描述
1、 建议将 style-loader 与 css-loader 结合使用
2、style-loader 与 css-loader 的作用:
css-loader 是找到所有有关css文件,style-loader将css-loader生成的文件挂载到dom元素中,样式才能生效

postcss-loader

使用 PostCSS 加载和转译 CSS/SSS 文件
autoprefixer可以自动在样式中添加浏览器厂商前缀,避免手动处理样式兼容问题,
具体操作:webpack配置autoprefixer
webpack.config.js中配置autoprefixer

解决webpack autoprefixer配置不生效

webpack.config.js

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

添加postcss-loader和插件配置:

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

在package.json配置

 "browserslist": [
    "defaults",
    "not ie < 11",
    "last 2 versions",
    "> 1%",
    "iOS 7",
    "last 3 iOS versions"
  ]

第五:让plugins打包更便捷

plugins 是在打包的某一时刻处理
HtmlWebpackPlugin 会在打包结束后,自动生成html文件,并把打包生成js自动引入html文件中
clean-webpack-plugin

plugins: [
        new HtmlWebpackPlugin({
            title: 'webpack app'
        })
    ],

第六: Sourcemap 配置

sourcemap 是一个映射关系, 它知道dist 目录下main.js文件哪一行出错,然后对应的src下面的index.js文件中的哪一行

devtool

此选项控制是否生成,以及如何生成 source map。
,Source map就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每一个位置,所对应的转换前的位置。
在这里插入图片描述
打包性能最快的是 eval
source-map 打包过后会生成 映射出新的文件.map文件
cheap-source-map 会将映射的文件 直接打包到main.js文件
cheap-module-source-map是涵盖loader的一下文件
在开发环境中 devtool可以使用:cheap-module-eval-source-map
在生产环境中devtool可以使用: cheap-eval-source-map

第七:使用webpackDevServer 提升开发效率

利用 webpackDevServer 启动本地服务器

devServer: {
      contentBase: './dist',
      open: true, // 默认打开浏览器
      port: 8080
    },

利用node 启动本地服务器

const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const config = require('./webpack.config.js');
const complier = webpack(config); // 进行编译

const app = express();
app.use(webpackDevMiddleware(complier, {
    publicPath: config.output.publicPath
}))

app.listen(3000, ()=>{
    console.log('server is start');
})

第八 Hot Moudle Replacement 热模块更新

热模块更新针对css样式的更新

devServer: {
      contentBase: './dist',
      open: true, // 默认打开浏览器
      port: 8080,
      hot: true,  // 热模块更新触发条件
      hotOnly: true // 启用热模块替换,而无需页面刷新作为构建失败时的回退。
    },

Plungins 配置

new webpack.HotModuleReplacementPlugin()

第七 使用babel 处理Es6语法

import “@babel/polyfill”; 如果是写业务代码时,建议使用 presets , 如果是写类库,polyfill可能会全局污染环境
在这里插入图片描述

  {
     test: /\.m?js$/,
     exclude: /node_modules/,
     use: {
      loader: "babel-loader",
       options: {
           presets: [['@babel/preset-env',
           {
               targets: {
                   chrome: "67", // 根据浏览器版本号限制进行打包,减少main.js的体积
               },
               useBuiltIns: "usage" // 根据代码需求,进行按需代码打包
           }]]
      // 诸如内置插件Promise,Set和Map那些会污染全局范围  
       plugins: [["@babel/plugin-transform-runtime",
                            {
                                "corejs": 2,
                                "helpers": true,
                                "regenerator": true,
                                "version": "7.0.0-beta.0"
                            }]]
       }
   }
 },

第八 Tree Shaking 概念详解

Tress shaking 只支持 ES Module引用 不支持commonJs引用 是因为动态引入
tree shaking 是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)

tree shaking操作:

通过 package.json 的 “sideEffects” 属性,来实现这种方式。
如果所有代码都不包含 side effect,我们就可以简单地将该属性标记为 false,来告知 webpack,它可以安全地删除未用到的 export。
注意,所有导入文件都会受到 tree shaking 的影响。这意味着,如果在项目中使用类似 css-loader 并 import 一个 CSS 文件,则需要将其添加到 side effect 列表中,以免在生产模式中无意中将它删除

"sideEffects": [
    "*.css"
  ]

第九 dev 和 prod模式下区分打包

将两个webpack新建两个文件进行分别打包
在 packjson文件中:

 "scripts": {
    "dev": "webpack-dev-server --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js",
  },

将webpack 配置文件进行分成 生产和开发文件,这样有利于代码管理,并且将webpack的公共方法抽离出来,新建一个webpack.common.js文件进行管理,
然后通过 webpack-merge 进行合并管理, 例如生产环境中代码如下:

const { merge }= require('webpack-merge');
const commonConfig = require("./webpack.common")

const prodConfig= {
    mode: 'production',
    devtool: 'cheap-module-source-map',
}

module.exports = merge(commonConfig, prodConfig)

第十 webpack 和 code Splitting

代码分割 和 webpack无关,
webpack中实现代码分割,两种方式
1、 同步代码:只需要在webpack.common.js中做optimization的配置
2、异步代码(import): 无需做任务配置,会自动进行代码分割,放置到新的文件中

optimization: {
        splitChunks: {
            chunks: 'all'
        }
    },

第十一 SplitChunksPlugin 配置参数详解

optimization: {
        splitChunks: {
            chunks: 'all', // 在做代码分割时,只对异步代码生效 async 对同步代码和异步代码同时做代码分割 all, chunks和cacheGroups配合使用
            minSize: 30000,  // 大于30kb才做代码分割, 如果设置30000000就没有生效
            maxSize: 0, // 超过多少kb进行对代码进行二次分割
            minChunks: 1, // 大于多少数量不会再代码分割
            maxAsyncRequests: 5, // 同时加载的模块数最多是 5个
            maxInitialRequests: 3,  // 入口文件加载时,入口文件引入的库,最多3个,多的话不会在进行代码分割
            automaticNameDelimiter: '~', //文件名的连接符
            name: true,
            cacheGroups: { // 缓存组 打包同步的库,会通过vandor进行处理
                vendors: {
                    test: /[\\/]node_modules[\\/]/, // 如果引入的库在node-module中的话,那么就会把那个库分割到vandors.js,
                    priority: -10, // 权重值越大,优先级就越高
                    filename: 'vendors.js'
                },
                default: { // 针对没有在node-module的库,进行默认代码分割
                    priority: -20,
                    reuseExistingChunk: true, // 指的是一个模块打包过,如果再次打包,则忽略掉模块,使用之前打包过的模块
                    filename: 'common.js'
                }
            }
        }
   }

第十二 Lazy Loding 懒加载 和 chunk 是什么?

懒加载或者按需加载,是一种很好的优化网页或应用的方式。这种方式实际上是先把你的代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或即将引用另外一些新的代码块。这样加快了应用的初始加载速度,减轻了它的总体体积,因为某些代码块可能永远不会被加载。

第十二 打包分析, preloading, prefetching

进行打包的分析网址: https://github.com/webpack/analyse
然后在packjson.js 中添加

webpack --profile --json > stats.json

预取/预加载模块(prefetch/preload module)

webpack v4.6.0+ 添加了预取和预加载的支持。
在声明 import 时,使用下面这些内置指令,可以让 webpack 输出 “resource hint(资源提示)”,来告知浏览器:
prefetch(预取):将来某些导航下可能需要的资源
preload(预加载):当前导航下可能需要资源
在这里插入图片描述

Chrome性能分析工具Coverage使用方法

打开控制台–》点击‘Sources’–》ctrl+shift+p–》在命令窗口输入coverage–》在下边新出现的窗口中点击左上角刷新按钮。
在这里插入图片描述
第十三 css 文件代码分割
MiniCssExtractPlugin 为每个引入 CSS 的 JS 文件创建一个 CSS 文件 一般用于线上环境,在dev环境不支持hmr 热模块更新
css 代码分割详解 :css 代码分割

第十四 webpack 与浏览器缓存 catching

我们可以通过替换 output.filename 中的 substitutions 设置,来定义输出文件的名称。webpack 提供了一种使用称为 substitution(可替换模板字符串) 的方式,通过带括号字符串来模板化文件名。其中,[contenthash] substitution 将根据资源内容创建出唯一 hash。当资源内容发生变化时,[contenthash] 也会发生变化。

output: {
        filename: '[name].[contenthash].js', // contenthash 是为了区分浏览器缓存,添加的hash值进行区分
        chunkFilename: '[name].[contenthash].js'
    }

第十五 Shimming 预置依赖

webpack compiler 能够识别遵循 ES2015 模块语法、CommonJS 或 AMD 规范编写的模块。然而,一些 third party(第三方库) 可能会引用一些全局依赖(例如 jQuery 中的 $)。因此这些 library 也可能会创建一些需要导出的全局变量。这些 “broken modules(不符合规范的模块)” 就是 shimming(预置依赖) 发挥作用的地方。

注意:我们不推荐使用全局依赖!webpack 背后的整个理念是使前端开发更加模块化。也就是说,需要编写具有良好的封闭性(well contained)、不依赖于隐含依赖(例如,全局变量)的彼此隔离的模块。请只在必要的时候才使用这些特性。

第十六 渐进式网络应用程序(PWA)

渐进式网络应用程序(progressive web application - PWA),是一种可以提供类似于native app(原生应用程序) 体验的 web app(网络应用程序)。PWA 可以用来做很多事。其中最重要的是,在**离线(offline)**时应用程序能够继续运行功能。这是通过使用名为 Service Workers 的 web 技术来实现的。

第十七 使用webpackdevServer 实现请求转发

devServer.proxy
如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。dev-server 使用了非常强大的 http-proxy-middleware 包。更多高级用法,请查阅其文档。

proxy:{
        "/react/api": 'http://www.dell-lee.com'
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值