查看webpack版本_webpack 上

版本

webpack@4

  • 安装方法在官网,在webpack后面加个 @4即可
  • 学会看文档,如果webpack升级到5了,也可以使用同样思路
  • 官网 https://webpack.js.org/

f6da02f24e4b29c98ef007987f3f2372.png

使用 npm 或者 yarn

// npm
npm info webpack version  // 查看 webpack 版本号
npm info webpack  // 查看 webpack 所有信息
npm init -y // 初始化 package.json
npm install webpack webpack-cli --save-dev // 本地安装 webpack

// yarn
yarn init -y
yarn add webpack webpack-cli --dev

08c078a0f81cf6be1f7e307e7abcc763.png

webpack-dev-server

用于本地预览

用 webapck 转译 JS

文档:https://webpack.js.org/guides/getting-started/

9231d65babe5ef8ca5610854c42372da.png

0cc18c57845a3e416dd51e5e91be192c.png

npx

自动找 webpack 路径

3049ce254daba7f2c3661eed06c0b4cd.png

10934377ef6e0430667cf9a8a22fa4e1.png

可以看到 webpack 转译了 index.js,压缩后代码变成了 dist 里 main.js,webpack还可以转译一些复杂的js代码,比如 import、export default 等等在浏览器运行。

webpack-config

前面使用 npx webpack 时有个配置警告,WARNING in configuration,直接搜索警告https://webpack.js.org/concepts/configuration/

1c050473f07f0098000f75466a344adf.png

再次使用 CRM 学习法!创建 webpack-config.js,复制上面代码,只修改指定的 mode 警告!然后再次 npx webpack

6b577033807e9c12ce0c119fd7f4be79.png

924fcacc9c8e7ac3558d1994caeb82be.png

成功!然后发现main.js 代码已经变化了

mode 两种模式

细心的话会发现 main.js 的代码已经变了

c24a18ba839c8da67d77cdae0b245f26.png

这是因为 mode 有两种模式,development(开发中) 或者 production(发布中),换到production再npx webpack就能看出区别了

cb38e2850cf6ec704692b85c5380900f.png

d9945d6f7639fe4a441241dc57395957.png

代码又被压缩体积变小了!

入口、出口

entry 入口

可配置entry默认入口

25ba2849cb1ee9c906601b330da3ad40.png

再次执行 npx webpack,就发现变成 foo.bundle.js了

20691f351dec4282e3ba87c32496939b.png

output 出口

很显然 ,它可以把src下的index.js 转译成 dist 目录下的main.js,但是我们可以更改 filename,再次执行 npx webpack

64863d0c94bbfc4fd969e2db696cd9c7.png

path是默认的dist,可以不用

文件名 hash

搜索关键字 webpack filename hash,使用 CRM 学习方法

output: {
    filename: "[name].[contenthash].js",
},

然后执行 npx webpack,会发现转译后的文件名后面多了一串数字,这关联到 HTTP缓存

2cb2eea2bc441a2ed39f1a2fae39326f.png

Cache Control

http缓存

何为http缓存?举个栗子,假设我们第一次访问百度,请求了很多文件

2f82b43b11453d3fd9eb330fe291dd20.png

当我们再次访问百度时,百度是不是会重新把这些文件全部加载一遍?答案是不会,为了提高网站访问响应速度,一般都会使用 HTTP缓存!假设我们给这些文件加上缓存,比如一年!当第二次访问百度时,只需要下载最新html,然后 index.html再从内存里面请求已经缓存了的文件,访问速度超快!!!

2c9d40a2e9bde260e8a56ee4106d6a12.png

5a12150b1e17666201982042ad32059a.png

如果一年中有更新怎么办?为什么index.html不用缓存?

更新缓存

由于缓存是跟着文件名走的,只要更新文件名就好了!只要对文件名做一个hash就可以了,假如文件内容更改,然后再次发布 webpack,webpack会把文件名更改,浏览器看见更改的文件名就会重新请求新的文件。

index.html 是不能缓存的,因为如果连首页都缓存了,那么是不能去更新局部文件的!首页缓存了只有一年后才会更新,,,

插件

删除重复文件

由于webpack会生成新文件,dist里的文件会越来越多,所以要先 rm -rf dist/; npx webpack,但是每次都要执行这两句命令很烦,有没有什么快捷方式呢?答案是有的。

在package.json 里 script 里加一句:

build": "rm -rf dist && webpack"

那么以后打包只需执行:

npm run build 
// 或者 
yarn build

就能每次删掉多余的文件了!

HtmlWebpackPlugin

使用插件生成 html

yarn add html-webpack-plugin --dev 
// module_export 里面再加一句 
plugins: [new HtmlWebpackPlugin()]

运行 yarn build 成功

07f3410f4d95c96b9aac64b3bb58943d.png

可以把main.xxx.js 更改名字。插件还可以自定义:https://github.com/jantimon/html-webpack-plugin

4a0b86c3fc14b559cff9107d1556c228.png
plugins: [
  new HtmlWebpackPlugin(),
  new HtmlWebpackPlugin({  
    title: 'My App',
    template: 'src/assets/test.html'
  })
]

还有很多功能,,,

css-loader

生成 css,搜索关键词 webpack css loader

yarn add css-loader --dev 

yarn add style-loader --dev

然后再次运行 yarn build 成功

5958c9db7515070be8deff254bb7eb31.png

webpack-dev-server

  • 文件内容变化就自动转译代码,并自动刷新页面
  • 提供 server 方便开发预览

每次build挺麻烦的,可以使用 webpack-dev-server来快速开发,实现自动刷新

// 下载 
yarn add webpack-dev-server --dev  

// webpack.config.js 
devtool: 'inline-source-map', 
devServer: {  contentBase: './dist', },  

// package.json 
"start": "webpack-dev-server --open",

MiniCssExtractPlugin

之前是用 js 生成 style标签,那能不能把 css 抽成文件呢?答案肯定是有的,使用 MiniCssExtractPlugin

// 下载
yarn add mini-css-extract-plugin --dev

// plugins
plugins: [
  new MiniCssExtractPlugin({
    // Options similar to the same options in webpackOptions.output
    // all options are optional
    filename: '[name].css',
    chunkFilename: '[id].css',
    ignoreOrder: false, // Enable to remove warnings about conflicting order
  }),
],
  
// use
use: [
    {
      loader: MiniCssExtractPlugin.loader,
      options: {
        publicPath: "../",
        hmr: process.env.NODE_ENV === "development",
      },
    },
    "css-loader",
],
  
// 缓存
new MiniCssExtractPlugin({
  filename: "[name].[contenthash].css",
  chunkFilename: "[id].[contenthash].css",
}),

6b32a2812798c1e39263908aa75036fb.png

根据模式选择不同途径

使用不同的 webpack config 文件,分为webpack.config.js / webpack.config.prod.js / webpack.config.base.js

// webpack.config.js 开发模式下使用
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const base = require("./webpack.config.base.js"); // 引入 base

module.exports = {
  ...base,
  devtool: "inline-source-map",
  devServer: {
    contentBase: "./dist",
  },
  module: {
    rules: [
      {
        test: /.css$/i,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
};

// webpack.config.prod.js 生产环境下使用
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const base = require("./webpack.config.base.js"); // 引入 base

module.exports = {
  ...base,
  mode: "production", // 生产模式
  plugins: [
    ...base.plugins,
    new MiniCssExtractPlugin({
      filename: "[name].[contenthash].css",
      chunkFilename: "[id].[contenthash].css",
      ignoreOrder: false,
    }),
  ],
  module: {
    rules: [
      {
        test: /.css$/i,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: "../",
            },
          },
          "css-loader",
        ],
      },
    ],
  },
};

// webpack.config.base.js 让前两个文件继承共有属性
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "index.[contenthash].js",
  },
  devServer: {
    contentBase: "./dist",
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "ky --github.com",
      template: "src/assets/index.html",
    }),
  ],
};

// package.json build时使用新配置
"build": "rm -rf dist && webpack --config webpack.config.prod.js"

通过让开发模式与生产环境继承 webpack.config.base.js,做到不同的环境使用不同的配置,配置间是继承的关系,这样就能通过不同的webpack config 文件来更方便的使用 webpack打包!

也可以搜索 webpack config merge 使用第三方库来做到同样的效果。

webpack 上 总结

  • 将一个或多个 JS 文件打包成对应的文件
  • 将一个或多个 CSS 文件打包成对应的文件
  • 压缩代码
  • 将高版本的 JS转译成低版本的 JS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值