webpack4从零搭建

webpack 4:从零配置开始

创建一个新目录并进入该目录:

CommandLine 代码:

mkdir webpack-4-quickstart && cd $_

通过运行以下命令初始化 package.json :

CommandLine 代码:
npm init -y

并引入 webpack 4:

CommandLine 代码:

npm i webpack --save-dev

我们还需要 webpack-cli ,作为一个单独的包引入:

CommandLine 代码:
npm i webpack-cli --save-dev

现在打开 package.json 并添加一个 build(构建) 脚本:

package.json 代码:
"scripts": {

"build": "webpack"

}

关闭文件并保存。

尝试运行:

CommandLine 代码:
npm run build

看看会发生什么:

CommandLine 代码:
ERROR in Entry module not found: Error: Can't resolve './src' in '~/webpack-4-quickstart'

webpack 4 在 ./src 中寻找 entry point(入口点) ! 如果您不知道这意味着什么,请查看 官方的说明文档 。

简而言之: entry point(入口点) 是 webpack 寻找开始构建 Javascript 包的文件。

在以前版本的 webpack 中,必须在名为 webpack.config.js 的配置文件中 通过 entry 属性定义 entry point(入口点) 。

但是 从 webpack 4 开始,不再必须定义 entry point(入口点) :它将默认为 ./src/index.js !

测试这个新功能很简单。 创建 ./src/index.js

index.js 代码:
console.log(`I'm a silly entry point`);

然后运行构建命令:

CommandLine 代码:
npm run build

您将在 ~/webpack-4-quickstart/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 的输出,你会看到一个很好的警告:

The ‘mode’ option has not been set. Set ‘mode’ option to ‘development’ or ‘production’ to enable defaults for this environment.
“模式”选项尚未设置。 将 “mode” 选项设置为 “development” 或 “production” 以启用此环境的默认值。

那是什么意思? 让我们来看看。

打开 package.json 并填充 script 部分,如下所示:

package.json 代码:
"scripts": {

"dev": "webpack --mode development",

"build": "webpack --mode production"

}

现在尝试运行:

CommandLine 代码:
npm run dev

并看看 ./dist/main.js 。 你看到了什么? 是的,我知道,一个令人厌烦的 bundle(包) 文件…,没有压缩!

现在尝试运行:

CommandLine 代码:
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 中配置它们!

这是一个例子:

package.json 代码:
"scripts": {

"dev": "webpack --mode development ./foo/src/js/index.js --output ./foo/main.js",

"build": "webpack --mode production ./foo/src/js/index.js --output ./foo/main.js"

}

webpack 4:用 Babel 8 转译 Javascript ES6

现代 Javascript 主要是用 ES6 编写的。

但并非每个浏览器都知道如何处理 ES6 。 我们需要某种转换。

这个转换步骤称为 transpiling(转译)。 transpiling(转译)是指采用 ES6 并使旧浏览器可以理解的行为。

Webpack 不知道如何进行转换但是有 loader(加载器) :将它们视为转译器。

babel-loader 是一个 webpack 的 loader(加载器),用于将 ES6 及以上版本转译至 ES5 。

要开始使用 loader ,我们需要安装一堆依赖项。

我们开始动手吧:

CommandLine 代码:

npm i babel-loader babel-preset-env "@babel/core" "@babel/preset-env" "@babel/runtime" "@babel/plugin-proposal-class-properties" "@babel/plugin-transform-runtime" --save-dev

接下来,通过在项目文件夹中创建名为 .babelrc 的新文件来配置 Babel :

.babelrc 代码:

     {

       "presets": ["@babel/preset-env"],

      "plugins": ["@babel/plugin-transform-runtime", "@babel/plugin-proposal-class-properties"]

    }

此时我们有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(加载器),您仍然需要创建配置文件。

我问过 Sean 这件事: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.exports = {

module: {

rules: [

{

test: /\.js$/,

exclude: /node_modules/,

use: {

loader: "babel-loader"

}

}

]

}

};

除非您要自定义 entry point(入口点) ,否则无需指定它。

接下来打开 ./src/index.js 并编写一些 ES6 代码:

index.js 代码:
const arr = [1, 2, 3];

const iAmJavascriptES6 = () => console.log(...arr);

window.iAmJavascriptES6 = iAmJavascriptES6;

最后,创建 bundle(包):

CommandLine 代码:
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 构建项目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值