0%

babel

webpack 是一个用于现代javascript应用程序的静态模块打包工具。

https://webpack.docschina.org/concepts/

入口

指示webpack应该使用哪个模块来作为构建其内部依赖图的开始
默认为./src/index.js
配置

1
2
3
module.exports = {
entry: './path/to/my/entry/file.js',
};

补充部分
单个入口:entry: string | [string]

1
2
3
module.exports = {
entry: './path/to/my/entry/file.js',
};
1
2
3
4
5
module.exports = {
entry: {
main: './path/to/my/entry/file.js',
},
};
1
2
3
4
5
6
module.exports = {
entry: ['./src/file_1.js', './src/file_2.js'],
output: {
filename: 'bundle.js',
},
};

对象语法:entry: { string | [string] } | {}

1
2
3
4
5
6
module.exports = {
entry: {
app: './src/app.js',
adminApp: './src/adminApp.js',
},
};

描述入口的对象

  • dependOn: 当前入口所依赖的入口。它们必须在该入口被加载前被加载。
  • filename: 指定要输出的文件名称。
  • import: 启动时需加载的模块。
  • library: 指定 library 选项,为当前 entry 构建一个 library。
  • runtime: 运行时 chunk 的名字。如果设置了,就会创建一个以这个名字命名的运行时 chunk,否则将使用现有的入口作为运行时。
  • publicPath: 当该入口的输出文件在浏览器中被引用时,为它们指定一个公共 URL 地址
    1
    2
    3
    4
    5
    6
    7
    8
    9
    module.exports = {
    entry: {
    a2: 'dependingfile.js',
    b2: {
    dependOn: 'a2',
    import: './src/app.js',
    },
    },
    };
    注意:
  1. runtime 和 dependOn 不应在同一个入口上同时使用
  2. runtime 不能指向已存在的入口名称
  3. dependOn 不能是循环引用的

输出

指定webpack在哪里输出它创建的bundle,以及如何命名这些文件
主要输出文件默认值是./dist/main.js,其他生成文件默认放置在./dist文件夹中
配置

1
2
3
4
5
6
7
8
9
const path = require('path'); //它是一个Node.js核心模块,用于操作文件路径

module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve(__dirname, 'dist'), //bundle生成的emit放在哪里
filename: 'my-first-webpack.bundle.js', //webpack bundle的名称
},
};

多入口output配置

1
2
3
4
5
6
7
8
9
10
module.exports = {
entry: {
app: './src/app.js',
search: './src/search.js',
},
output: {
filename: '[name].js', // 写入到硬盘:./dist/app.js, ./dist/search.js
path: __dirname + '/dist',
},
};

Loader

webpack 只能理解 JavaScript 和 JSON 文件,这是 webpack 开箱可用的自带能力。loader 让 webpack 能够去处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用,以及被添加到依赖图中。
在更高层面,在 webpack 的配置中,loader 有两个属性:

  1. test 属性,识别出哪些文件会被转换。
  2. use 属性,定义出在进行转换时,应该使用哪个 loader。

配置

1
2
3
4
5
6
7
8
9
10
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 转换一下。

css-loader和ts-loader

1
npm install --save-dev css-loader ts-loader
1
2
3
4
5
6
7
8
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: 'css-loader' },
{ test: /\.ts$/, use: 'ts-loader' },
],
},
};

配置方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
// [style-loader](/loaders/style-loader)
{ loader: 'style-loader' },
// [css-loader](/loaders/css-loader)
{
loader: 'css-loader',
options: {
modules: true
}
},
// [sass-loader](/loaders/sass-loader)
{ loader: 'sass-loader' }
]
}
]
}
};

插件

用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。

1
2
3
4
5
6
7
8
9
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件

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

在上面的示例中,html-webpack-plugin 为应用程序生成一个 HTML 文件,并自动注入所有生成的 bundle。

模式

通过选择 development, production 或 none 之中的一个,来设置 mode 参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为 production。

1
2
3
module.exports = {
mode: 'production',
};

浏览器兼容性

环境