Webpack基础实例

webpack

初始化项目

mkdir blog
cd blog

npm init -y
npm install -save --dev webpack webpack-cli
npm install -save --dev style-loader css-loader  # 用于import css文件后,打包时使用
npm install -save --dev html-webpack-plugin  # 用于打包时,自动生成html
npm install -save --dev copy-webpack-plugin  # 复制文件到dist
npm install -save --dev babel-loader @babel/core @babel/preset-env # 低版本浏览器打包
npm install -save --dev terser-webpack-plugin # 压缩打包后的代码
npm install -save --dev webpack-dev-server # 开发时,修改后自动打包, package.json script
npm install -save --dev webpack-bundle-analyzer # webpack 可视化的打包分析工具
npm install -save --dev jest # 单元测试

# 或者使用yarn
# yarn init -y
# yarn add --dev webpack webpack-cli 
# yarn add --dev style-loader css-loader
# yarn add --dev html-webpack-plugin
# yarn add --dev babel-loader @babel/core @babel/preset-env
# yarn add --dev terser-webpack-plugin
# yarn add --dev webpack-dev-server
# yarn add --dev webpack-bundle-analyzer
# yarn add --dev jest

# 使用vscode 打开当前目录
code .

新建文件

在这里插入图片描述

index.js

import "css/style.css"; // 使用webpack定义的路径别名
import { listFoods } from "utils/data";
import bgImg from "img/bg.png";

const data = listFoods();
const ul = document.createElement("ul");
data.forEach((e, i) => {
  const li = document.createElement("li");
  li.innerText = e;
  ul.appendChid(li);
});
document.body.appendChild(ul);

// 把图片放到body的开头
const img = document.createElement("image");
img.src = bgImg;
document.body.prepend(img);

data.js


function listFoods() {
  return ["苹果", "香蕉", "草莓"];
}

export { listFoods };

新建 webpack.config.js文件

  webpack.config.js 是webpack打包的核心,其一切功能都通过此文件设置。可以设置环境、产物、组件、loader解析器等。
  entry的单页面则只配置string类型;多页面则配置成Object,每个key则可以在HtmlWebpackPlugin 里的chunks和excludeChunks使用。
  下面代码中,已注释的,表示可以不配置,会有默认值。

const path = require("path"); // 导入nodejs平台的path库
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 用于生成html
const TerserPlugin = require("terser-webpack-plugin"); // 用于压缩打包后的代码
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; // 打包分析器
const CopyWebpackPlugin = require("copy-webpack-plugin"); // 复制文件到dist

module.exports = {

  mode: "development",  // production生产环境,development开发环境
  entry: "./src/index.js", // 入口文件路径,即js import的开始路径文件
  /*
  	// 可以在entry里设置chunks,在HtmlWebpackPlugin的chunks里使用,一般用于多页面
	entry: {
		main: './src/index.js',
		common: './src/common.js',
		list: './src/list.js',
		detail: './src/detail.js'
	},
*/
  output: {		// 打包后的,出口信息		
    // 出口文件名,[name]默认名,[contenthash]哈希值,防止浏览器缓存文件
    filename: "[name].[contenthash].js",
    path: path.resolve(__dirname, "dist"), // 存放目录, resolve()可拼接目录
  },
  resolve: {
    alias: {  // 设置路径别名, import的时候所有位置都直接 'utiles/date.js'
      utils: path.resolve(__dirname, "src/utils"),
      css: path.resolve(__dirname, "src/css"),
      img: path.resolve(__dirname, "src/img"),
    }
  },
  devtool: "inline-source-map", // 开发模式下方便查看打包后的js源代码
  devServer:{  // webpack-dev-server, 开发模式的运行时服务器设置
  	// contentBase: resolve('./dist'), // 对外提供的访问内容的路径
  	// host: '127.0.0.1', 
  	port: 8080, 
  	headers: { // 向所有的请求添加headers
  	},
  	https: true, // 默认情况下dev-server使用http协议,通过配置可以支持https
    /*https: {
       key: fs.readFileSync("/path/to/server.key"),
       cert: fs.readFileSync("/path/to/server.crt"),
       ca: fs.readFileSync("/path/to/ca.pem"),
    },*/
    /*proxy: {  // 设置代理主机地址,即本地地址会转到代理地址.
     '/api': {
         target: 'https://xxx.com/api', // 代理地址
         pathRewrite: {
           '^/api': ''
         },
         changeOrigin: true
      }
    }*/
  },
  optimization: {
    minimize: true,  // 是否压缩打包后的文件
    minimizer: [new TerserPlugin()], // 使用的压缩器
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: "首页",  // 页面的标题
      template: path.resolve(__dirname, `src/index.html`), // 本地模板文件的位置
	  favicon: path.resolve(__dirname, `src/favicon.ico`), //配置网站图标
      inject: true, // true或body:js插入到body元素的底部, head:插入head, false: 不注入, 默认head
      chunks:['common','main'], // 不配置,默认会将entry中所有的thunk注入到模板中,多页面时区分使用js
      excludeChunks: ['list', 'detail'], // 与chunks相反,设置不注入的chunks
    }),  // 使用html插件
    new BundleAnalyzerPlugin(), // 打包分析器
    new CopyWebpackPlugin({
      // 需拷贝的配置项
      patterns: [{
          from: "public", // 从哪里 copy
          // to: '', 这里可以省略 to,自动从 output 的 path 去找
          globOptions: {
            ignore: ['**/index.html'] 
              // 这里必须在前面加 **/ 表示从当前路径下忽略
              // 且忽略目录中文件后不能为空
          }
        }],
    }),
  ],
  module: {
    rules: [  // 里面的每一项就是一种文件loader
      {
        test: /\.css$/i, // 用于匹配文件,用正则表达式
        use: ["style-loader", "css-loader"] // 使用哪些loader
      }, {
        test: /\.(png|jpg|jpeg|svg|gif)$/i, // 匹配图片
        type: "asset/resource" // 因图片使用内置的loader,使用type属性
      }, {
        // 使用babel打包,可以在低版本浏览器运行
        test: /\.js$/,
        use: {   // use 使用对象,可以对loader进行设置 
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"]  // 
          },
        }
      }
    ],
  },
}

修改package.json

添加scripts代码

  "scripts": {
    "test": "jest --coverage",
    "start": "webpack serve --open",
    "build": "webpack"
  },

运行

npm run start # 运行项目
npm run test  # 运行单元测试
npm run build # 打包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值