webpack 4:Webpack4.X
从零配置开始
1、创建一个新目录并进入该目录:
mkdir webpack-4.X && cd $_
完成之后进入创建好的文件夹,完成以下操作
2、通过运行以下命令初始化 package.json
:
npm init -y
3、并引入 webpack 4:
npm i webpack --save-dev
4、我们还需要 webpack-cli ,作为一个单独的包引入:
npm i webpack-cli --save-dev
5、现在打开 package.json
并添加一个 build
(构建) 脚本:
package.json 代码:
"scripts": {
"build": "webpack"
}
6、关闭文件并保存。
尝试运行:
npm run build
看看会发生什么:
Insufficient number of arguments or no entry found.
Alternatively, run 'webpack(-cli) --help' for usage info.
Hash: e22d9cbf4c86c79ab1fd
Version: webpack 4.28.0
Time: 157ms
Built at: 2018-12-20 09:40:10
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for thisvalue. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
ERROR in Entry module not found: Error: Can't resolve './src' in '/Users/wujiahao/webTest/webpack-4.X'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! webpack-4.X@1.0.0 build: `webpack`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the webpack-4.X@1.0.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wujiahao/.npm/_logs/2018-12-20T01_40_10_578Z-debug.log
webpack 4 在
./src
中寻找 entry point(入口点) ! 如果您不知道什么是入口,请查看 官方的说明文档。
简而言之: entry point(入口点) 是 webpack 寻找开始构建 Javascript 包的文件。
在以前版本的 webpack 中,必须在名为
webpack.config.js
的配置文件中 通过entry
属性定义 entry point(入口点) 。
但是 从 webpack 4 开始,不再必须定义 entry point(入口点) :它将默认为
./src/index.js
!
7、测试这个新功能很简单。 创建 ./src/index.js
:
index.js 代码:
console.log(`I'm yi ge ru kou wen jian`);//调皮了一下
8、然后运行构建命令:
npm run build
你将在
~/webpack-4.X/dist/main.js
中获取该 bundle(包) 。
什么? 稍等片刻。 没有必要定义输出文件? 对的。
在 webpack 4 中,既不必须定义 entry point(入口点) ,也不必须定义 output file(输出文件)。
webpack 的主要优势在于 code splitting(代码拆分)。 但请相信我,使用零配置工具可以加快速度。
所以这是第一条新闻:webpack 4 不是必须要有配置文件。
它将查找 ./src/index.js
作为默认入口点。 而且,它会在 ./dist/main.js
中输出模块包。
在下一节中,我们将看到 webpack 4 的另一个不错的功能:生产和开发模式。
webpack 4:production(生产) 和 development(开发) 模式
拥有2个配置文件在 webpack 中是的常见模式。
一个典型的项目可能有:
- 用于开发的配置文件,用于定义 webpack dev server 和其他东西
- 用于生产的配置文件,用于定义 UglifyJSPlugin,sourcemaps 等
虽然较大的项目可能仍然需要 2 个配置文件,但在 webpack 4 中,您可以在没有一行配置的情况下完成。
怎么会这样?
webpack 4 引入了 production(生产) 和 development(开发) 模式。
事实上,如果你注意 npm run build
的输出,你会看到一个很好的警告:
WARNING in configuration
The 'mode' option has not been set,
webpack will fallback to 'production' for thisvalue.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more:
https://webpack.js.org/concepts/mode/
警告在配置
“mode”选项还没有设置,webpack将返回到“production”。集
“开发”或“生产”的“模式”选项
为每个环境启用默认值。
您还可以将其设置为“none”,以禁用任何默认行为。了解更多信息:https://webpack.js.org/concepts/mode/
那是什么意思? 让我们来看看。
打开 package.json
并填充 script
部分,如下所示:
package.json 代码:
"scripts": {
"dev": "webpack --mode development",
"build": "webpack --mode production"
}
现在尝试运行:
npm run dev
并看看 ./dist/main.js
。 你看到了什么? 是的,我知道,一个让人疑惑的 bundle(包) 文件…,并没有压缩的文件!
现在尝试运行:
npm run build
再来看看 ./dist/main.js
。 你会看见一个 压缩后的 bundle(包)!
是的!
production mode(生产模式) 可以开箱即用地进行各种优化。 包括压缩,作用域提升,tree-shaking 等。
另一方面,development mode(开发模式)针对速度进行了优化,仅仅提供了一种不压缩的 bundle 。
所以这是第二条新闻:webpack 4 引入了 production(生产) 和 development(开发) 模式。
在 webpack 4 中,您可以在没有一行配置的情况下
完成任务! 只需定义--mode 参数
即可免费获得所有内容!
webpack 4:覆盖默认 entry(入口)/output(输出)
我喜欢 webpack 4 零配置,但如何覆盖默认 entry point(入口点) 和 默认 output(输出) 呢?
在 package.json
中配置它们!
这是一个例子,输入的内容的文件夹和文件必须存在,输出的无所谓 如下例./entry/src/js/index.js
这个入口文件必须
存在:
package.json 代码:
1. "scripts": {
2. "dev": "webpack --mode development ./entry/src/js/index.js --output ./entry/main.js",
3. "build": "webpack --mode production ./entry/src/js/index.js --output ./entry/main.js"
4. }
也可以在webpack.config.js当中
module.exports = {
entry: {
main: './entry/src/js/index.js'
},
output: {
filename: './entry/main.js',
}
};
webpack 4:用 Babel 7 转译 Javascript ES6
现代 Javascript 主要是用 ES6 编写的。
但并非每个浏览器都知道如何处理 ES6 。 我们需要某种转换。
这个转换步骤称为 transpiling(转译)。 transpiling(转译)是指采用 ES6 并使旧浏览器可以理解的行为。
Webpack 不知道如何进行转换但是有 loader(加载器) :将它们视为转译器。
babel-loader 是一个 webpack 的 loader(加载器),用于将 ES6 及以上版本转译至 ES5 。
要开始使用 loader ,我们需要安装一堆依赖项。 尤其是:
- babel-core
- babel-loader
- babel-preset-env 用于将 Javascript ES6 代码编译为 ES5
我们开始动手吧:
npm i babel-core babel-loader babel-preset-env --save-dev
npm i babel-loader @babel/core @babel/preset-env --save-dev
接下来,通过在项目文件夹中创建名为 .babelrc
的新文件来配置 Babel :
.babelrc
代码:
//{
// "presets": [
// ["env",
// {
// "modules": false
// }
// ]
// ]
//}
#因为新版本的babel更新 原配置修改如下
{
"presets": ["@babel/preset-env"]
}
此时我们有2个配置 babel-loader 的选项:
- 使用 webpack 的配置文件
- 在你的 npm scripts 中使用
--module-bind
是的,我知道你在想什么。 webpack 4 将自己作为零配置工具推向市场。 为什么要再次编写配置文件?
webpack 4 中零配置的概念适用于:
-
entry point(入口点) 默认为
./src/index.js
-
output(输出) 默认为
./dist/main.js
- production(生产) 和 development(开发) 模式 (无需为生产和开发环境创建2个单独的配置)
这就够了。 但是对于在 webpack 4 中使用 loader(加载器)
,您仍然需要创建配置文件。
webpack 4 中的加载器是否与 webpack 3 相同? 有没有计划为像 babel-loader 这样的普遍使用的 loader(加载器) 提供零配置?
是的!
“对于未来(在v4之后,可能是4.x或5.0),我们已经开始探索预置或附加系统将如何帮助定义它。我们不想要的是:尝试将一堆东西作为默认设置插入到 core 中,我们想要的是:允许其他人扩展“
现在你仍然必须依赖 webpack.config.js。 让我们来看看…
webpack 4:通过配置文件使用 babel-loader
给 webpack 添加一个配置文件,以最经典的方式使用 babel-loader
。
创建一个名为 webpack.config.js
的新文件并配置 loader(加载器) :
webpack.config.js 代码,但是如果你连基本的正则表达式都看不懂我建议你补一点再来看
:
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
presets: ['env', { modules: false }]
}
}
}
]
}
除非您要自定义 entry point(入口点) ,否则无需指定它
。
接下来打开 ./src/index.js
并编写一些 ES6 代码:
index.js 代码:
const arr = [1, 2, 3];
const ES6fn = () =>
console.log(...arr);
window.ES6fn = ES6fn;
最后,创建 bundle(包):
npm run build
现在看一下 ./dist/main.js
来查看转换后的代码。
webpack 4:不通过配置文件使用 babel-loader(在 npm scripts 中使用)
还有另一种方法来使用 webpack 的 loader(加载器)。
--module-bind
参数允许你在命令行指定加载器。 谢谢 Cezar 指出这一点。
该参数不是特定于 webpack 4 的。 从版本 3 开始就有了。
要在没有配置文件的情况下使用 babel-loader ,请在 package.json 中配置你的 npm scripts,如下所示:
package.json 代码:
"scripts": {
"dev": "webpack --mode development --module-bind js=babel-loader",
"build": "webpack --mode production --module-bind js=babel-loader"
}
你可以再出运行 npm run build
构建项目。
webpack 4:为 React 项目配置 webpack 4
一旦你安装并配置了 babel ,这里就很容易了。
安装 React
:
npm i react react-dom --save-dev
接下来添加 babel-preset-react
:
npm i @babel/preset-react --save-dev
在 .babelrc 中配置预设:
.babelrc
代码:
{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
]
}
很快就完成了!
你可以配置 babel-loader
来读取 .jsx
文件。 如果你的 React 组件 正在使用 jsx
扩展,这将非常有用。
打开 webpack.config.js
并像这样配置 loader(加载器) :
webpack.config.js 代码:
module.exports = {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
}
]
}
};
要测试一下你可以在 ./src/App.js
中创建一个测试的 React 组件:
App.js 代码:
import React from "react";
import ReactDOM from "react-dom";
const App = () => {
return (
<div>
<p>React here!</p>
</div>
);
};
export default App;
ReactDOM.render(<App />, document.getElementById("app"));
接下来在 ./src/index.js
中 import(导入) 组件:
index.js 代码:
import App from "./App";
然后再次运行构建 npm run build
。
webpack 4:HTML webpack 插件
webpack 需要两个额外的组件来处理HTML:html-webpack-plugin 和 html-loader。
添加依赖项:
npm i html-webpack-plugin html-loader --save-dev
然后更新 webpack 配置:
webpack.config.js 代码:
const HtmlWebPackPlugin = require("html-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
},
{
test: /\.html$/,
use: [
{
loader: "html-loader",
options: { minimize: true }
}
]
}
]
},
plugins: [
new HtmlWebPackPlugin({
template: "./src/index.html",
filename: "./index.html"
})
]
};
接下来在 ./src/index.html
中创建一个 HTML 文件:
index.html 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>webpack 4 quickstart</title>
</head>
<body>
<div id="app">
</div>
</body>
</html>
然后再次运行构建:
npm run build
并查看 ./dist
文件夹。 您应该看到生成的 HTML 。
没有必要在 HTML 文件中引入您的 Javascript :bundle(包) 会自动注入。
在浏览器中打开 ./dist/index.html
:您应该看到 React 组件正常工作!
正如您所看到的,在处理 HTML 方面没有任何改变。
webpack 4 仍然是一个针对 Javascript 的模块打包器。
但是有计划将 HTML 添加为模块(HTML作为 entry point(入口点))。
webpack 4:将 CSS 提取到一个文件中
webpack 不知道如何将 CSS 提取到一个文件中。
在过去,这是 extract-text-webpack-plugin
的工作。
不幸的是,这个插件与 webpack 4 不太兼容。
根据 Michael Ciniawsky 的说法:
extract-text-webpack-plugin
的维护已经成为了一个很大的负担,这已经不是第一次因为它的问题,而使升级 webpack 主版本变的而复杂和繁琐
mini-css-extract-plugin 可以解决这些问题。
注意:确保将 webpack 更新到 4.2.0 版。 否则 mini-css-extract-plugin
将无效!
使用以下命令安装该插件和 css-loader :
npm i mini-css-extract-plugin css-loader --save-dev
接下来创建一个用于测试的 CSS 文件:
css 代码:
/* */
/* ./src/main.css */
/* */
body {
line-height: 2;
}
配置插件和 loader(加载器):
webpack.config.js 代码:
const HtmlWebPackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const path = require('path')
const webpack = require('webpack')
module.exports = {
entry:'./src/main.js',
output: {
filename: './src/dist/index.js',
},
devServer: {
// 服务器的根目录 Tell the server where to serve content from
// https://webpack.js.org/configuration/dev-server/#devserver-contentbase
contentBase: path.join(__dirname, './src'),
// 自动打开浏览器
open: true,
// 端口号
port: 8888,
//指定要使用的主机。默认情况下这是localhost。如果您希望外部可以访问您的服务器,请像下面这样指定
// host:'0.0.0.0',
// --------------- 1 热更新 -----------------
hot: true,
// 开启gzip压缩
compress: true
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader"
}
},
{
test: /\.html$/,
use: [{
loader: "html-loader",
options: { minimize: true }
}]
},
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
]
},
plugins: [
//--------------------开启热更新----------------------------------
new webpack.HotModuleReplacementPlugin(),
//--------------------开启自动将JS当中文件导入到html----------------------------------
new HtmlWebPackPlugin({
template: "./src/index.html",
filename: "./index.html"
}),
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[id].css"
})
]
};
最后在 entry point(入口点) import(导入) CSS:
index.js 代码:
1. //
2. // PATH OF THIS FILE: ./src/index.js
3. //
4. import style from "./main.css";
然后再次运行构建:
npm run build
并查看 ./dist
文件夹。你应该看到生成的CSS!
回顾一下:extract-text-webpack-plugin
不适用于webpack 4 。请改用 mini-css-extract-plugin
代替。
webpack 4:webpack dev server
每当你对代码进行更改时,运行 npm run dev
? 远非我们的理想。
使用 webpack 配置开发服务器只需一分钟。
配置好的 webpack dev server 将在浏览器中启动您的应用程序。
每次更改文件时,它都会自动刷新浏览器的窗口。
要设置 webpack dev server,请安装包:
npm i webpack-dev-server --save-dev
接下来打开 package.json
并调整 scripts ,如下所示:
package.json:
"scripts": {
"start": "webpack-dev-server --mode development --open ",
"build": "webpack --mode production"
}
保存并关闭文件。
现在,通过运行以下命令:
npm run start
你会看到 webpack dev server 在浏览器中启动你的应用程序。
webpack dev server 非常适合开发。 (它也可以使 React Dev Tools 在您的浏览器中正常工作)。