Webpack 的 4 个核心概念

一、准备工作

1.根据已有的 package.json 文件安装需要的包。

2. 打开命令行工具,输入命令 : npm install

3. 安装完成后,项目文件夹中会多出一个 node_modules 文件夹,用于存放安装的包。

二、entry

  • 官方文档:入口起点(entry points) | webpack 中文网
  • 入口起点(entry point)指示 webpack 应该使用哪个模块,来作为打包的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
  • 单入口写法:
module.exports = {
  entry: './src/index.js'
};
  • 多入口写法,需要写成对象的形式:
module.exports = {
  entry: {
     main: './src/index.js',
     search: './src/search.js'
   }
};

三、output

  • 官方文档:输出(output) | webpack 中文网
  • output 属性告诉 webpack 在哪里输出它所打包后的文件,默认值为 ./dist,以及如何命名这些文件。基本上,整个应用程序结构,都会被编译到这个指定的输出路径的文件夹中。
  • 单入口输出:
// Node.js path 模块提供了一些用于处理文件路径的小工具
// 通常可以通过以下方式引入该模块:
const path = require('path');

module.exports = {
    output: {
        // path.resolve将给定的路径构造成一个绝对路径
        // __dirname表示当前文件所在目录的绝对路径
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
    }
}
  • 多入口输出:
// Node.js path 模块提供了一些用于处理文件路径的小工具
// 通常可以通过以下方式引入该模块:
const path = require('path');

module.exports = {
    output: {
        // path.resolve将给定的路径构造成一个绝对路径
        // __dirname表示当前文件所在目录的绝对路径
        path: path.resolve(__dirname, 'dist'),
        // [name] 代表入口对象的键名
        filename: '[name].js'
    }
}

示例:

①测试一下多入口输出的效果。

  • 完整的 webpack.config.js 文件内容:
// Node.js path 模块提供了一些用于处理文件路径的小工具
// 通常可以通过以下方式引入该模块:
const path = require('path');

module.exports = {
  mode: 'development',
  entry: {
    main: './src/index.js',
    search: './src/search.js'
  },

  output: {
    // path.resolve将给定的路径构造成一个绝对路径
    // __dirname表示当前文件所在目录的绝对路径
    path: path.resolve(__dirname, 'dist'),
    // [name] 代表入口对象的键名
    filename: '[name].js'
  }
};

② 在命令行运行 : npm run webpack

  • 打包后的js文件

③ 使用打包后的js文件运行html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>entry 和 output</title>
  </head>
  <body>
    <script src="./dist/main.js"></script>
    <script src="./dist/search.js"></script>
  </body>
</html>

        注:在ie11与chrome浏览器中都能够正确输出。

四、loader

  • 官方文档:loader | webpack 中文网
  • loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块(modules),然后你就可以利用 webpack 的打包能力,对它们进行处理。

示例:

① 为此,首先安装相对应的 loader 以及 相关的 Babel 包:

npm install --save-dev babel-loader@8.1.0
npm install --save-dev @babel/core@7.11.0 @babel/preset-env@7.11.0
  • 安装完后的package.json。

② 配置 babel-loader

  • 在 webpack 配置对象(webpack.config.js)中,需要添加 babel-loader 到 module 的 loaders 列表中,像下面这样:
module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          // 添加了这个属性后就不需要再创建 Babel 的配置文件了
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}

③ 命令行运行:npm run webpack

  • 查看编译后的js文件。

        注:Babel 本身可以编译 ES6 的大部分语法,比如 let、const、箭头函数、类,但是对于 ES6 新增的 API,比如 Set、Map、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign/Array.from)都不能直接编译,需要借助其它的模块。

  • 查看编译后的代码在浏览器中的运行结果。

④ 补充: 为了让Babel能够同样对ES6 新增的 API进行编译,需要安装一个新的包(core-js)

        命令:npm install --save-dev core-js@3.6.5

import "core-js/stable";
  • 再重新编译查看在浏览器中的运行结果。

        注:都能够成功的输出结果,说明Babel对ES6 新增的 API编译成功了。

五、plugins

  • 官方文档:插件(plugins) | webpack 中文网
  • 各种插件的目录:Plugins | webpack 中文网
  • loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件功能极其强大,可以用来处理各种各样的任务。

以 html-webpack-plugin 插件作为例子演示插件的用法:

① 安装 html-webpack-plugin 插件

  • html-webpack-plugin 插件将会生成一个 HTML5 文件, 其中包括使用 script 标签的 body 中的所有 webpack 包。
  • html-webpack-plugin 插件文档地址(HtmlWebpackPlugin | webpack 中文网
  • 命令 :npm install --save-dev html-webpack-plugin@4.3.0

② 配置 html-webpack-plugin 插件

③ 运行:npm run webpack

  • 编译打包后的结果。

④ 补充:多页面时 html-webpack-plugin 插件的配置

  • webpack.config.js 文件
// Node.js path 模块提供了一些用于处理文件路径的小工具
// 通常可以通过以下方式引入该模块:
const path = require('path');
// 引入html-webpack-plugin 插件
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.js',
    search: './src/search.js'
  },

  output: {
    // path.resolve将给定的路径构造成一个绝对路径
    // __dirname表示当前文件所在目录的绝对路径
    path: path.resolve(__dirname, 'dist'),
    // [name] 代表入口对象的键名
    filename: '[name].js'
  },
  
  plugins: [
    // 单入口
    // new HtmlWebpackPlugin({
    //   // 提供自己的模板HTML文件,html-webpack-plugin 会自动将所有必要的 CSS、JS、清单和网站图标文件注入到标记中。
    //   template: './3.html'
    // }),

    // 多入口
    new HtmlWebpackPlugin({
      template: './index.html',
      // 定义生成文件的名称
      filename: 'index.html',
      // 指定需要引入的模块,名字与入口对象的键名对应
      chunks: ['index']
    }),
    new HtmlWebpackPlugin({
      template: './search.html',
      filename: 'search.html',
      chunks: ['search']
    })
  ]
};
  • 运行后的dist文件夹中的内容。

⑤ html-webpack-plugin 插件的其他功能

  • 重新打包查看生成的HTML文件有什么不同。

        注: 删除了 HTML 文件中的注释、空格、标签属性值的双引号,充分压缩文件大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值