初学WebPack

0 什么是Webpack?

WebPack 顾名思义, 网页打包,   将相关资源进行整合,方便发布,常见于各种前端框架中

官网中的解释是

本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph),此依赖图对应映射到项目所需的每个模块,并生成一个或多个 bundle

博客写于2021年,现在webpack的版本号是5.370

webpack 主要分为 entry ,ouput, loader,plugins 等一些进价的配置节点

官网中首页的图非常的形象描述了webpack, 帮你把各种资源 按照一定的配置转换成浏览器需要的格式

1 webpack 开始

环境要求

运行 webpack 5 的 Node.js 最低版本是 10.13.0 (LTS)。

安装方法

npm install webpack webpack-cli --save-dev

从 webpack4 开始起,默认安装后,是没有配置文件的.需要自己手动新建 文件,文件名称默认为 webpack.config.json,还可以在打包的时候加上 npx webpack --config webpack.config.js 文件名(这样就可以使用不同的配置文件)进行打包, 也可以修改 package.json 里面的build 命令,用npm run build 进行打包

值得注意的是  配置文件中是使用的CommonJS规范

2 webpack常用配置点

下面将一下配置文件中的几个常用节点

entry  入口

进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

入口分为单入口(是一种简写方式) 和 多入口(完整的写法)

//单入口(简写)写法 语法为:entry: string | [string]
//示例1
module.exports = {
  entry: './path/to/my/entry/file.js',
};

//上面也是这种多入口语法的一种简写
module.exports = {
  entry: {
    main: './path/to/my/entry/file.js',
  },
};

//示例2
module.exports = {
  entry: ['./src/file_1.js', './src/file_2.js'],
  output: {
    filename: 'bundle.js',
  },
};

//对象语法(比较完整的写法)
entry: { <entryChunkName> string | [string] } | {}

//示例1
module.exports = {
  entry: {
    app: './src/app.js',
    adminApp: './src/adminApp.js',
  },
};
//对象中还有以下的扩展属性
//dependOn: 当前入口所依赖的入口。它们必须在该入口被加载前被加载。
//filename: 指定要输出的文件名称。
//import: 启动时需加载的模块。
//library: 指定 library 选项,为当前 entry 构建一个 library。
//runtime: 运行时 chunk 的名字。如果设置了,就会创建一个以这个名字命名的运行时 chunk,否则将使
//用现有的入口作为运行时。
//publicPath: 当该入口的输出文件在浏览器中被引用时,为它们指定一个公共 URL 地址。请查看 //output.publicPath。
//示例2
module.exports = {
  entry: {
    a2: 'dependingfile.js',
    b2: {
      dependOn: 'a2',
      filename:'test',
      import: './src/app.js',
    },
  },
};

output 输出

可以通过配置 output 选项,告知 webpack 如何向硬盘写入编译文件。注意,即使可以存在多个 entry 起点,但只能指定一个 output 配置。

//示例一
module.exports = {
  output: {
    filename: 'bundle.js',
  },
};

//实例二
module.exports = {
 output: {
    filename: '[name].js',
    path: __dirname + '/dist',
  },
};


//output.filename - 用于 initial chunk 文件
//output.chunkFilename - 用于 non-initial chunk 文件
//在某些情况下,使用 initial 和 non-initial 的 chunk 时,可以使用 output.filename。
//这些字段中会有一些 占位符。常用的占位符如下:
//[id] - chunk id(例如 [id].js -> 485.js)
//[name] - chunk name(例如 [name].js -> app.js)。如果 chunk 没有名称,则会使用其 id 作为名称
//[contenthash] - 输出文件内容的 md4-hash(例如 [contenthash].js -> 4ea6ff1de66c537eb9b2.js)

还有一些其他属性,可以查看官网的配置

https://webpack.docschina.org/configuration/output/

loader

这个单词,在官网中没看到有翻译,百度翻译中 是 n.装货的人,装货设备,装弹机; 装板机;

个人感觉好像是 加载转换器 ,根据不同的规则去加载不同的文件,然后去做一些处理

loader 用于对模块的源代码进行转换。loader 可以使你在 import 或 "load(加载)" 模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的得力方式。loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript 或将内联图像转换为 data URL。loader 甚至允许你直接在 JavaScript 模块中 import CSS 文件!

在使用loader之前,需要先安装一下loader

例如 

npm install --save-dev css-loader 
//示例一:
module.exports = {
  module: {
    rules: [
      { test: /\.css$/, use: 'css-loader' },
      { test: /\.ts$/, use: 'ts-loader' },
    ],
  },
};
//整个节点说明.
module: { //【对象】如何处理模块,通过一堆loader
            noParse:不解析的部分。 // 如/moment(?!-)|node_modules\/chart\.js/, (忽略对部分没采用模块化的文件的递归解析和处理,这样做的好处是能提高构建性能)

        rules: [ //【对象数组】
            {
                // ****条件匹配****
                test: 正则匹配文件名或正则数组。 例如 [ /\.jsx?$/,/\.tsx?$/],

                include: 包含哪些文件(路径)或路径数组
                 例如 [
                                       path.resolve(__dirname, 'src'),
                                       path.resolve(__dirname, 'tests'
                                 ],

                exclude: 排除哪些文件
                 例如 path.resolve(__dirname, 'node_modules') ,因为node_modules 目录下的文件都是采用的 ES5 语法,没必要再通过 Babel 去转换。)

                // **** 应用规则(里面的每一项就是一个loader)****
                use: [ //【字符串数组(则由后往前执行) | 对象数组】
                            {
                                    loader: ‘babel-loader’,

                                    options:{
                                      cacheDirectory:true,
                                   },

                                   enforce: 调节这个loader的执行顺序。
                                    例如'post'把该 Loader 的执行顺序放最后
                            }
                 ]
            }
                  ]
    }

loader 除了上文说的配置方式, 还有内联方式,官网不太推荐,这里也不展开,有兴趣的可以去看看,下面是地址

https://webpack.docschina.org/concepts/loaders/#inline

值得注意的是

loader 从右到左(或从下到上)地取值(evaluate)/执行(execute) ,跟平常的不一样

loader现在目前有 处理 css less ts  es6转es5等 的loader 

有空的话,我会整理一下常用的loader.

plugins 插件

插件是 webpack 的 支柱 功能。webpack 自身也是构建于你在 webpack 配置中用到的相同的插件系统之上!插件目的在于解决 loader 无法实现的其他事

webpack 插件是一个具有 apply 方法的 JavaScript 对象。apply 方法会被 webpack compiler 调用,并且在 整个 编译生命周期都可以访问 compiler 对象。

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 访问内置的插件
const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    filename: 'my-first-webpack.bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        use: 'babel-loader',
      },
    ],
  },
  plugins: [
    //new一个对象
    //用于自定义编译过程中的进度报告
    new webpack.ProgressPlugin(),
    //HtmlWebpackPlugin 简化了 HTML 文件的创建,以便为你的 webpack 包提供服务。这对于那些文件名
    //中包含哈希值,并且哈希值会随着每次编译而改变的 webpack 包特别有用。你可以让该插件为你生成一个 
    //HTML 文件,使用 lodash 模板提供模板,或者使用你自己的 loader。
    new HtmlWebpackPlugin({ template: './src/index.html' }),
  ],
};

 

当然还有些进价的写法,还有待去摸索,这只是个入门

持续更新中..

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值