Webpack 快速入门

这一节我们配置最简单的Webpack前端工程,来快速入门Webpack整个打包流程。

一、Webpack的安装与命令行打包

配套代码是github仓库 https://github.com/jruit/webpack-tutorial 的webpack1-1例子

Webpack依赖Node.js,没有安装的话,去官网下载安装LTS稳定版本的Node.js。

在本地新建一个文件夹webpack1-1,在该文件夹下执行命令行

  npm init -y

该命令会初始化一个npm项目并使用默认参数创建package.json文件。

  npm install --save-dev webpack@4.43.0    webpack-cli@3.3.12    

该命令安装了指定版本的webpack与webpack-cli。这两个npm包作用如下,webpack是webpack核心包,webpack-cli是命令行工具包,在用命令行执行webpack的时候需要安装。详细的安装过程会在Webpack安装一节进行讲解,请尽量安装与教程版本一致的包。

我们代码逻辑很简单,在一个JS文件里定义一个字符串,然后在另外一个JS文件引入该文件并把字符串内容输出在浏览器控制台里。

项目下的主要文件如下:

Webpack快速入门

a.js内容

  // ES6的模块化语法
  import { name } from './b.js';  
  console.log(name);

b.js内容

  // ES6的模块化语法
  export var name = 'Jack';

HTML文件更简单,只是用来引入JS文件。

如果我们直接在本地HTML文件里引入a.js,浏览器会报错,一方面是浏览器对原始的ES6模块默认引入方式不支持而报错,另一方面即使使用支持的方式引入也会因本地JS引入的安全问题而报错。

所以,我们可以通过Webpack把这两个文件打包成一个JS文件来解决这个问题。Webpack打包后,代码里就没有这种模块化语法了。

我们执行命令

  npx webpack a.js -o bundle.js   

上面命令的作用:从a.js文件开始,按照模块引入的顺序把所有代码打包到bundle.js文件里。Webpack会自动处理打包后代码的顺序与依赖关系。-o是out的意思,表示输出。注意,webpack是打包命令,后面的是打包参数。

现在我们在HTML文件里引入bundle.js,打开浏览器控制台,正常输出字符串'Jack'。(如果你觉得HTML还是会从a.js和b.js读取内容,你可以把这两个文件删除试一下,你会发现这两个文件已经没有作用了。)

上面就是一个最简单的Webpack打包过程。打包后的bundle.js代码目前是压缩后的,后面会讲解怎样不压缩打包后的代码。

我们在执行上面命令的时候,命令行控制台会出现警告信息,告诉我们没有设置'mode'项,Webpack将会使用默认的'production'。我们可以在上面的命令后面配上'mode'项,但当命令参数过长的时候,使用起来就会不方便。此时,我们可以选择使用Webpack的配置文件。

二、Webpack的配置文件

Webpack默认的配置文件是项目根目录下的webpack.config.js,在我们执行下方命令的时候,

  npx webpack  

Webpack会自动寻找该文件并使用其配置信息进行打包。

现在我们在文件夹下新建webpack.config.js文件,里面的代码如下

  var path = require('path');  

  module.exports = {
    entry: './a.js',
    output: {
      path: path.resolve(__dirname, ''),
      filename: 'bundle.js'
    },
    mode: 'none'
  };

配套代码是github仓库 https://github.com/jruit/webpack-tutorial 的webpack1-2例子

命令行执行npx webpack后,Webpack就开始打包了。配置文件里的代码解释:

因为Webpack是基于Node.js执行的,所以可以使用Node的功能。path是Node.js里的路径解析模块,你可以将其看成是一个JS普通对象,该对象有一些方法可以供我们使用。我们现在使用了其resolve方法,该方法的作用是将方法参数解析成一个绝对路径返回。__dirname是Node.js的一个全局变量,表示当前文件的路径。这样,path.resolve(__dirname, '')表示的其实就是当前文件夹根目录的绝对路径。

module.exports是CommonJS模块导出语法,导出的是一个对象,该对象的属性就是Webpack打包要使用的参数。entry是Webpack构建的入口文件,我们的入口文件是a.js。output是打包后资源输出文件,其中path表示输出的路径,filename表示输出的文件名,现在我们把打包后的文件输出在当前目录的bundle.js。

mode是Webpack的打包模式,默认是'production',表示给生产环境打包的。现在我们设置成'none',这样代码就不会压缩了。

现在,我们就学会了Webpack命令行参数打包与配置文件打包两种打包方法。在我们实际项目中,我们都是使用配置文件打包的。简单的项目我们使用默认的webpack.config.js文件,复杂的项目可能会区分开发环境、测试环境与线上环境分别使用不同的配置文件,这些后续章节再讲。

三、小结

1.这节课我们主要学习了Webpack最简单的打包方式,希望通过本节课可以对Webpack打包有一个初步的认识。后续章节,我们将学习预处理器loader和插件等相关知识。

1.如果安装npm包慢的话,通过以下命令设置npm镜像源为淘宝npm后再安装

  npm config set registry https://registry.npm.taobao.org

2.npx webpack a.js -o bundle.js命令里npx是新版Node里附带的命令。它运行的时候默认会找到node_modules/.bin/下的路径执行。分别与下面的命令等效。

linux/unix命令行:

  node_modules/.bin/webpack a.js -o bundle.js

windows的cmd命令行(webpack1-1在D:\jiangruitao\路径下):

  D:\jiangruitao\webpack1-1\node_modules\.bin\webpack a.js -o bundle.js 

3.要真正掌握path.resolve的解析规则需要一些时间来练习,但这份Webpack教程只会用于解析简单的资源出口路径,也就是把两个路径参数用字符串连接起来就行了。如果你不想深入Node项目开发,暂时没必须要去研究path.resolve。

笔记与思考

  1. 麻烦请教一下,`path.resolve(__dirname, '')`为什么还要加第二个参数即空字符串呢?

    1. 这里也可以不加第二个参数。不过平时开发时,我们通常会使用第二个参数,这里就用了

发表评论

邮箱地址不会被公开。 必填项已用*标注