webpack 打包配置 从0到1

2021-11-01  本文已影响0人  付小影子

认识webpack

1111.png
webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具中文官方地址
1.可以帮助我们进行模块化,并且处理模块化间的各种复杂依赖关系,所以可以使用任意前端模块规范 AMD CMD CommonJs ,ES6
2.打包过程中可以对资源文件进行撤离,压缩图片,less转换css 等
3.通过各种loade的使用,可以吧css 图片等当做模块来使用
4.webpack为了能正常运行,必须依赖node环境下载node,查看node版本号:node -v
node 环境为了可以正常的执行代码,必须包含各种依赖的包,所以自带npm工具 软件包管理工具(node packages manager)

安装webpack

全局安装webpack
npm install webpack -g 

指定版本号全局安装webpack
npm install webpack@版本号 -g 

局部安装webpack(开发环境)
1.cd 对应目录
2.npm install webpack --save-dev

区分全局和局部,主要是为了有些时候 版本号不同的情况下打包出来的文件也不同
1.在终端(cmd终端或者vscode的terminal等)直接执行webpack命令,使用的是全局安装的webpack
2.在package.json文件中scripts 脚本中,如果使用了webpack命令,首先会找局部webpack,找不到才会找全局。

配置webpack

1.npm init ,初始化生成 package.json文件
2.创建webpack.config.js文件
3.设置入口文件和出口文件
4.webpack 和package.json 的脚本(scripts)绑定使用-》npm run xx 打包运行

const path = require("path");
module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
};

package.json scripts脚本模块
"scripts": {
    "build": "webpack"
  },

终端直接运行:npm run build
即可打包以main.js为入口的相互引用的各种js,css等文件,
合并生成dist目录下的bundle.js
目录结构

2222.png

main.js文件


//使用commonJs的模块化规范
const { add, mul } = require("./js/MathUtil");
console.log("hello");
console.log(add(1, 2));
console.log(mul(1, 2));

//使用es6的模块化规范
import { name, age, address } from "./js/useInfo";
console.log(name);
console.log(age);
console.log(address);

//把css 文件当成 模块导入
require("./style/main.css");

//依赖less文件
require("./style/normal.less");

webpack中loader的使用

loader 官方地址
webpack本身的能力来说,可以处理我们写的js代码,并且会自动处理js之间相关的依赖,但是开发中不仅仅有基本的js代码处理,还需要加载css,图片,包括将less scss等转换为css,.vue文件转成js文件等
对于webpack本身的能力来说,转化这些是不支持的,所以就需要给webpack进行扩展,也就是loader
loader 主要是用于转换某些类型的模块,是一个转换器。
使用过程
1.通过npm安装需要使用的loader
2.在webpack.config.js 中module->rules关键字下进行配置

最常用的loader:

1. 样式loader

less-loader
1.创建.less 文件

@width: 10px;

body {
 font-size: @width;
 color: yellow;
}

2.安装 sass-loader:

npm install sass-loader sass webpack --save-dev

3.webpack.config.js 配置rulues

const path = require("path");
module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        //css-loader 只负责讲css文件进行加载
        //style-loader 负责将样式添加到dom中
        //使用多个loader时,依次加载顺序从右边到左边
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/i,
        use: [
          // 将 JS 字符串生成为 style 节点
          "style-loader",
          // 将 CSS 转化成 CommonJS 模块
          "css-loader",
          // 将 Sass 编译成 CSS
          "sass-loader",
        ],
      },
    ],
  },
};
2.图片处理loader

1.安装url-loader和file-loader

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

2.配置webpack.config.js rules

{
        test: /\.(png|jpg|gif)$/i,
        use: [
          {
            loader: "url-loader",
            options: {
              //当加载的图片 小于limit时8k 会将图片编译Base64字符串形式
              //当加载的图片 大于limit时8k 需要使用file-loader模块进行加载
              limit: 8192, //限制大小可以修改
            },
          },
        ],
      },

3.在css中设置背景url图片

body {
    /* background: green; */
    background: url('../img/test.png');
  }

webpack自动帮助我们生成一个图片放在dist目录下,这个图片的名字很长,是一个32位的hash值,目的是防止名字重复。
实际项目中,可能对打包的图片名字有一定要求,并且要将所有的图片放在一个文件夹中,所有需要在webpack中rules 添加一定的配置--name

 options: {
              //当加载的图片 小于limit时8k 会将图片编译Base64字符串形式
              //当加载的图片 大于limit时8k 需要使用file-loader模块进行加载
              limit: 8192, //限制大小可以修改
              name:'img/[name].[hash:8].[ext]'
            },

img-->图片要打包的文件夹
[name]-->获取图片原来的名字
[hash:8]-->防止图片命名冲突,依然使用hash,但是只保留8位
ext-->使用图片原来的扩展名


3333.png

file-loader 可以指定要复制和放置资源文件的位置,以及如何使用版本哈希命名以获得更好的缓存。此外,这意味着 你可以就近管理图片文件,可以使用相对路径而不用担心部署时 URL 的问题。使用正确的配置,webpack 将会在打包输出中自动重写文件路径为正确的 URL。

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

Vue Loader

vue-loader是一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件
如果你不想手动设置 webpack,我们推荐使用 Vue CLI 直接创建一个项目的脚手架。通过 Vue CLI 创建的项目会针对多数常见的开发需求进行预先配置,做到开箱即用。

1.起步配置,安装loader

npm install -D vue-loader vue-template-compiler

2.配置webpack
Vue Loader 的配置和其它的 loader 不太一样。除了通过一条规则将 vue-loader 应用到所有扩展名为 .vue 的文件上之外,请确保在你的 webpack 配置中添加 Vue Loader 的插件:


5555.png

3.创建vue文件,通过template 显示view

webpack plugin的使用

plugin官方文档
plugin 插件列表
loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务,对现有的框架进行扩展。包括:打包优化,资源管理,注入环境变量。
使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。
多数插件可以通过选项(option)自定义。
你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建它的一个实例。
plugin使用过程
1.通过npm安装需要使用的plugins(某些webpack已经内置的插件不需要安装)
2.在webpack.config.js中的plugins中配置插件
常用的几个webpack插件

1.添加版权信息的plugin BannerPlugin 属于webpack自带的插件
1.const webpack = require("webpack");
2. new webpack.BannerPlugin("最终版权归付小影子所有"),

webpack 自带的 版权说明插件,会在dist目录中生成bundle.js.LICENSE.txt 文本文件


7777.png
2.HtmlWebpackPlugin

HtmlWebpackPlugin 简化了 HTML 文件的创建,以便为你的 webpack 包提供服务。这对于那些文件名中包含哈希值,并且哈希值会随着每次编译而改变的 webpack 包特别有用。你可以让该插件为你生成一个 HTML 文件,使用 lodash 模板提供模板,或者使用你自己的 loader
该插件将为你生成一个 HTML5 文件, 在 body 中使用 script 标签引入你所有 webpack 生成的 bundle
1.npm 安装plugin

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

2.webpack.config.js 配置

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

module.exports = {

  其他配置...

  plugins: [new HtmlWebpackPlugin()],
};

3. js压缩的插件 uglifyjs-webpack-plugin

1.npm 安装插件

npm install uglifyjs-webpack-plugin --save-dev

2.webpack.config.js 配置插件


6666.png

webpack 搭建本地服务器 webpack-dev-server

webpack 提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现让浏览器自动刷新修改后的效果,不用每一次都执行打包命令。
1.安装webpack-dev-server

npm install -D webpack-dev-server,
npm install webpack-cli@3 -D

2.配置webpack.config.js 中devserver选项

devServer: {
    contentBase: "./dist", // 服务器访问的文件目录
    open: true, //是否是立即打开
    port: 8080, //端口号
    host: "localhost", //链接地址
  },
3.在package.json 的scripts脚本配置中添加 webpack-dev-server的配置

"scripts": {
"build": "webpack",
"dev": "webpack-dev-server"
},
4.终端执行命令 npm run dev ,打开项目,修改项目内容的时候,也不需要重新打包编译
ctrl+c退出本地服务器

webpack中配置vue

1.npm 安装 vue

npm install vue --save

2.入口js文件中,创建vue对象,绑定到index.html 中
index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
    </div>
</body>
</html>

main.js

import Vue from "vue";
import App from "./APP";

//使用commonJs的模块化规范
const { add, mul } = require("./js/MathUtil");
console.log("hello");
console.log(add(1, 2));
console.log(mul(1, 2));

//使用es6的模块化规范
import { name, age, address } from "./js/useInfo";
console.log(name);
console.log(age);
console.log(address);

//把css 文件当成 模块导入
require("./style/main.css");

//依赖less文件
require("./style/normal.less");

//方式1
new Vue({
  el: "#app", //在index.html,创建div 设置id为app
  components: { App },
  template: "<App/>",
});

//方式2
// new Vue({
//   render: (h) => h(App),
// }).$mount("#app");

webpack 配置文件拆分 开发环境配置和生产环境配置

1.安装webpack-merge

npm install webpack-merge --save-dev

2.拆分config ->baseCongig devConfig,proConfig,通过webpackMerge合并,动态配置

8888.png
base-webpack-config.js
const path = require("path");
//vue加载插件
const { VueLoaderPlugin } = require("vue-loader");
//生成HTML文件插件
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "bundle.js",
    // publicPath: "dist/",
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        //css-loader 只负责讲css文件进行加载
        //style-loader 负责将样式添加到dom中
        //使用多个loader时,依次加载顺序从右边到左边
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/i,
        use: [
          // 将 JS 字符串生成为 style 节点
          "style-loader",
          // 将 CSS 转化成 CommonJS 模块
          "css-loader",
          // 将 Sass 编译成 CSS
          "less-loader",
        ],
      },
      {
        test: /\.(png|jpg|gif)$/i,
        use: [
          {
            loader: "url-loader",
            options: {
              //当加载的图片 小于limit时8k 会将图片编译Base64字符串形式
              //当加载的图片 大于limit时8k 需要使用file-loader模块进行加载
              limit: 8192, //限制大小可以修改
              name: "img/[name].[hash:8].[ext]",
            },
          },
        ],
      },
      {
        test: /\.vue$/,
        loader: "vue-loader",
      },
    ],
  },
  resolve: {
    //导入文件 省略扩展后缀名
    extensions: [".js", ".css", ".vue"],
    alias: {
      vue$: "vue/dist/vue.esm.js",
      "@pages": path.resolve(__dirname, "../src/pages"),
      "@style": path.resolve(__dirname, "../src/style"),
      "@img": path.resolve(__dirname, "../src/img"),
      "@component": path.resolve(__dirname, "../src/component"),
    },
  },

  plugins: [
    new HtmlWebpackPlugin({
      filename: "index.html", // 打包后的文件名,默认是index.html
      template: path.resolve(__dirname, "../src/index.html"), // 导入被打包的文件模板
    }),
    new VueLoaderPlugin(),
    new CleanWebpackPlugin(),
  ],
};

pro-webpack-config.js

const webpack = require("webpack");
//js文件压缩插件
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const WebpackMerge = require("webpack-merge");
const baseConfig = require("./base.webpack.config");

module.exports = WebpackMerge.merge(baseConfig, {
  plugins: [
    //webpack 自带的 版权说明插件,会在dist目录中生成bundle.js.LICENSE.txt 文本文件
    new webpack.BannerPlugin("最终版权归付小影子所有"),
    new UglifyJsPlugin(),
  ],
});

dev-webpack-config.js

const WebpackMerge = require("webpack-merge");
const baseConfig = require("./base.webpack.config");

module.exports = WebpackMerge.merge(baseConfig, {
  devServer: {
    contentBase: "./dist", // 服务器访问的文件目录
    open: true, //是否是立即打开
    port: 8080, //端口号
    host: "localhost", //链接地址
  },
});

package.json --config 指定配置文件

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

[测试demo地址](https://github.com/fuxiaoyingzi/MeetWebpack

上一篇下一篇

猜你喜欢

热点阅读