webpack的理解分析

130 阅读1分钟

什么事webpack?

  • webpack是一个用于现代Javascript应用程序的静态模块打包工具;
  • 当webpack处理应用程序时,会在内部从一个或多个入口点构建依赖图;
    • 每当一个文件依赖另一个文件时,webpack都会将文件视为直接存在依赖关系;
    • 这使得webpack可以获取非代码资源,如images或web字体,并会把他们作为依赖提供给应用程序;

入口

  • 入口起点是webpack应该使用那个模块,来作为构建内部以来图的开始;
  • 默认值是./src/index.js,也可以在webpack configuration 中配置entry属性,来制定不同的入口起点; webpack.config.js
module.exports = {
  entry: './path/to/my/entry/file.js',
};

输出(output)

  • output属性告诉webpack在哪里输出他所创建的bundle,以及如何命名这些文件;
  • 主要输出文件的默认值是./dist/main.js,其他生成文件默认放在./dist文件夹中 webpack.config.js
const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js',
  },
};
  • 我们通过 output.filename 和 output.path 属性,来告诉 webpack bundle 的名称,以及我们想要 bundle 生成(emit)到哪里。

loader

  • webpack只能理解Javascript和JSON文件;
  • loader能够去处理其他类型的文件,并转换为有效模块,以供应用程序使用,添加到依赖图中;
  • webpack一个强大的特性就是通过import导入任何类型的模块(例如.css);
  • 更高层面,在webpack配置中,loader有两个属性:
    • test属性,识别哪些文件会被转换;
    • use属性,定义在进行转换时,应该使用哪个loader; webpack.config.js
const path = require('path');

module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js',
  },
  module: {
    rules: [{ test: /.txt$/, use: 'raw-loader' }],
  },
};
  • 以上配置中,对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use。这告诉 webpack 编译器(compiler) 如下信息:
  • 嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 '.txt' 的路径」时,在你对它打包之前,先 use(使用)  raw-loader 转换一下。”

插件plugin

  • loader 用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。
  • 想要一个插件,你只需要require()它,const HtmlWebpackPlugin = require('html-webpack-plugin');;
  • 然后把她添加到plugins数组中,plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
  • 在下面示例中,html-webpack-plugin 为应用程序生成一个 HTML 文件,并自动将生成的所有 bundle 注入到此文件中。 webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack'); // 用于访问内置插件

module.exports = {
  module: {
    rules: [{ test: /.txt$/, use: 'raw-loader' }],
  },
  plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })],
};