1. 什么是webpack

webpack 是一个 JavaScript 应用程序的静态模块打包器(module bundler)。

它做的事情就是分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。

正如webpack官网的这张图片,可以看出Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。

简单的说,webpack是一个打包模块化js的工具,可以通过loader转换文件,通过plugin扩展功能

1.1 工作方式

把项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件:

  • 读取文件分析模块依赖
  • 对模块进行解析执行(深度遍历)
  • 针对不同的模块使用相应的loader
  • 编译模块,生成抽象语法树AST
  • 循环遍历AST树,拼接输出js

2. webpack安装

同样,webpack也需要本地环境有Node.js支持。我们直接可以使用npm进行webpack的安装:

npm install webpack    :使用npm本地项目安装webpack

npm install webpack -g  :使用npm全局安装webpack

cnpm install webpack   :使用cnpm本地项目安装webpack

当我们在安装路径下的node_modules中查看到webpack时表明成功安装了webpack。

成功安装了webpack后,我们输入webpack -h查看帮助:

webppack -h

输出内容如下:

从内容我们可以看出,命令提示要求安装webpack-cli,这是因为在webpack 3中,webpack本身和它的CLI以前都是在同一个包中,但在第4版中,他们已经将两者分开来更好地管理它们。所以我们还需要安装webpack-cli

npm install webpack-cli

安装完之后,我们进入node_modules/.bin/后,输入如下命令就可以查看具体的信息了:

webpack -v

webpack -h

所以总的来说,我们安装webpack时的命令应该是:

npm install webpack webpack-cli

或者

npm install webpack webpack-cli -D :将webpack和webpack-cli安装到devDependencies中

3. webpack简单示例

  • 创建一个空文件夹
mkdir webpacktest

或者在cmd中

md webpacktest
  • 进入创建的文件夹目录
cd webpacktest
  • npm初始化并生成一个package.json文件
npm init 
  • 安装webpack
安装webpack和webpack的客户端wepback-cli(简易客户端,用来以webpack协议连接相应服务)到开发依赖devDependencies。
npm i -D webpack webpack-cli   :-D表示安装到devDependencies
  • 创建示例脚本
创建helloworld.js内容如下:

function hello() {

console.log("hello world")

}
  • 打包
.\node_modules\.bin\webpack helloworld.js   直接运行webpack 打包,默认前目录下的默认会创建dist目录,打包为main.js

从提示我们可以看出,使用webpack打包时,如果没有webpack的配置文件时,应该提供mode,使用mode可以为webpack获得一些默认的配置,其主要包括如下:

    •   none:默认情况,表示没有任何配置优化处理,这样打包出来的文件可读性比较差,如刚才打包时默认情况下打包的main.js文件。
    •   development:是告诉程序,现在是开发状态,也就是打包出来的内容要对开发友好显示,并且启动了一些插件,如使用--mode development模式进行导报时,打包的main.js文件。
    •   production:是告诉程序,现在是正式版本状态,同时也是增加了一些比较实用的插件,如使用--mode development模式进行打包

所以webpack的三种mode可以简单总结如下:

同时,在webpack打包时,默认是将打包的main.js文件放入当前文件目录的dist文件下,我们也可以使用-o参数来指定出口文件:

.\node_modules\.bin\webpack helloworld.js -o .\test\main.js --mode development

我们可以看到打包的main.js文件就放到了当前文件目录下的test文件夹下:

  • 结合npm run命令打包
首先在package.json文件中增加如下内容

"scripts": {

"build": "webpack ./helloworld.js -o ./dist/main.js --mode development"

}

然后打包,就直接运行npm run build即可

npm run build

4. webpack配置

从 webpack v4.0.0 开始,可以不用引入一个配置文件,也就是我们说的可以使用--mode模式,但为了更强的功能,我们仍然需要自己配置webpack,配置文件为webpack.config.js,而webpack的配置主要从下面五个方面入手:

  • 入口(entry)
  • 输出(output)
  • loader
  • 插件(plugins)
  • 模式

4.1. 入口(entry)

入口指示了 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。正如上面webpack的工作方式所讲的,webpack进入指定的入口后,从这个文件开始找到你的项目的所有依赖文件(直接和间接),并构建依赖图,然后每个依赖项随即被处理,最后输出到称之为 bundles 的文件中。

webpack.config.js中入口的配置使用entry属性,如单个入口配置方式:

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

多个入口配置方式:

module.exports = {
  entry: {
    pageOne: './src/pageOne/index.js',
    pageTwo: './src/pageTwo/index.js',
    pageThree: './src/pageThree/index.js'
  }
};

如上,告诉了webpack 需要 3 个独立分离的依赖图,也就是表示了这是一个多页面应用程序,在多页应用中,(每当页面跳转时)服务器将为你获取一个新的 HTML 文档。页面重新加载新文档,并且资源被重新下载。

4.2. 输出(output)

output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。webpack.config.js文件中使用outpu属性来配置出口,我们知道入口可以存放多个,但是出口就只能填写一个。

webpack.config.js文件中output属性最基本的配置要包含:

  • filename:用于输出文件的文件名;
  • path:目标输出目录的绝对路径。

module.exports = {
  output: {
    filename: 'bundle.js',
    path: '/home/proj/public/assets'
  }
};

如上,通过 output.filename 和 output.path 属性,来告诉我们打包文件的文件名和路径。

如果是针对多个入口(也就是多个应用的),其入口配置可如下:

module.exports = {
  entry: {
    app: './src/app.js',
    search: './src/search.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/dist'
  }
}

如上,最终打包的文件名及路径分别为:./dist/app.js,./dist/search.js

4.3. loader

loader 用于对模块的源代码进行转换,让webpack 能够去处理那些非 JavaScript 文件(因为webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后就可以利用 webpack 的打包能力,对它们进行处理。

本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

比如我们想要webpack 加载 CSS 文件,或者将 TypeScript 转为 JavaScript,那么我们先要引入这两个loader:

npm install --save-dev css-loader

npm install --save-dev ts-loader

然后在webpack.config.js文件配置如下:

module.exports = {

  module: {

rules: [

#表示webpack 对每个 .css 使用 css-loader

      { test: /\.css$/, use: 'css-loader' },

#表示webpack对每个 .ts 文件使用 ts-loader

      { test: /\.ts$/, use: 'ts-loader' }

    ]

  }

};

其中test用于使用正则表示的方式匹配文件,而use表示使用的loader。

4.4. 插件(plugins)

插件是 webpack 的支柱功能,其目的在于解决 loader 无法实现的其他事。

webpack 插件是一个具有 apply 属性的 JavaScript 对象。apply 属性会被 webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问。

const config = {

  entry: './path/to/my/entry/file.js',

  output: {

    filename: 'my-first-webpack.bundle.js',

    path: path.resolve(__dirname, 'dist')

  },

  module: {

    rules: [

      { test: /\.(js|jsx)$/, use: 'babel-loader'}

    ]

  },

  plugins: [

    new webpack.optimize.UglifyJsPlugin(),

    new HtmlWebpackPlugin({template: './src/index.html'})

  ]

};

module.exports = config;

4.5. 模式

模式用来告知 webpack 使用相应模式的内置优化,通过选择 development 或 production 之中的一个,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化。

启用模式为development开发模式:

module.exports = {
  mode: ‘development
};

当启用mode为development时,相当于:

module.exports = {
    plugins: [
        new webpack.NamedModulesPlugin(),
        new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }),
    ]
};

启用模式为production正式模式:

module.exports = {
  mode: ‘production
};

当启用mode为production时,相当于:

module.exports = {
    plugins: [
        new UglifyJsPlugin(/* ... */),
        new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
        new webpack.optimize.ModuleConcatenationPlugin(),
        new webpack.NoEmitOnErrorsPlugin()
        ]
};

5. webpack常用构建命令

webpack              -开发环境构建

webpack -p           -生产环境构建(压缩混淆脚本)

webpack --watch     –监听变动并自动打包

webpack -d           –生成 map 映射文件

webpack --colors    –构建过程带颜色输出

6. 其他

本文只是简单的了解了下webpack,包括其工作原理和基本的配置项,具体的配置内容以及前端项目怎么去配置可能后续再了解。

参考网址:

https://www.webpackjs.com/

https://blog.csdn.net/userkang/article/details/83504048

【软件测试部署基础】webpack的认识的更多相关文章

  1. 【软件测试部署基础】gradle的认识

    1. gradle简介 Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天. 1.1. ANT ...

  2. 【软件测试部署基础】maven的认识

    最近部门分享测试环境部署相关内容,在同事的分享下,学到了很多新的知识点,也是我们在测试环境部署的时候非常重要的一些基本的知识点,当你系统的去了解了一下,你会发现后端在maven相关的点上有个清晰的了解 ...

  3. 【软件测试部署基础】yarn的认识

    1. yarn是什么 Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.其主要是为了弥补 npm 的一些少量的缺陷而 ...

  4. 【软件测试部署基础】npm的认识

    1. npm简介 先来看下官方介绍: npm makes it easy for JavaScript developers to share and reuse code, and it makes ...

  5. 部署React+webpack工程的步骤

    # 部署React+webpack工程的步骤ps:以Mac os系统做开发环境.因为npm现在使用灰常的慢,所以我使用淘宝境像cnpm. 1,准备工作: 先确保存已经安装了node.js: 2,文件部 ...

  6. 运维与自动化系列④自动化部署基础与git

    运维与自动化系列④自动化部署基础与git 自动化部署基础与git 一:上一篇的代码是保存在本地,但是在生产环境当中是由版本控制进行代码管理,以便于发布代码和回滚,一般是使用gitlib比较多,另外还有 ...

  7. 运维与自动化系列③自动化部署基础与shell脚本实现

    自动化部署基础与shell脚本实现 关于自动化的基础知识: 1.1:当前代码部署的实现方式: 运维纯手工scp到web服务器纯手工登录git服务器执行git pull或svn服务器执行svn upda ...

  8. iOS系统及客户端软件测试的基础介绍

    iOS系统及客户端软件测试的基础介绍 iOS现在的最新版本iOS5是10月12号推出,当前版本是4.3.5 先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPho ...

  9. WDS部署基础知识:使用WDS捕获与应用映像(使用WDS定制系统和应用)

    WDS部署基础知识:使用WDS捕获与应用映像(使用WDS定制系统和应用) Win7部署基础知识(8):使用WDS捕获与应用映像  一.添加映像组 使用WDS捕获映像时,会将映像加载到WDS服务器的映像 ...

随机推荐

  1. javascript中什么是函数

    函数的定义 在javascript中函数是一段可以被执行或调用任意次数的JavasScript代码,在数据类型中属于"function".函数也拥有属性和方法,因此函数也是对象. ...

  2. [MIT6.006] 16. Dijkstra

    先回顾下上节课的内容: 下面来看一个定理:对于所有的点来说,放松操作总是满足 d[v] ≥ δ(s, v).即点s到点v的最短路径总是小于或等于当前点d的路径权重.证明如下: 在正是进入复杂的图前,先 ...

  3. zabbix 告警实践分享 一键实现zabbix 电话、邮件、微信告警

    众所周知Zabbix 是一款用来监控IT基础设施的监控套件,同时也具有很多方便运维人员使用的优秀功能,如:支持多条件告警,支持多种告警方式,支持多组模板.支持模板继承,因此在众多的开源运维监控软件中独 ...

  4. java里split(" {1,}")什么意思啊?

    将字符串按照括号内的内容分割成字符数组这里括号内是正则表达式,X{m,n}代表X至少重复m次,至多重复n次这里空格至少重复1次,就是将字符串以一个或多个空格分割如"1 2 ab c" ...

  5. 结合实战和源码来聊聊Java中的SPI机制?

    写在前面 SPI机制能够非常方便的为某个接口动态指定其实现类,在某种程度上,这也是某些框架具有高度可扩展性的基础.今天,我们就从源码级别深入探讨下Java中的SPI机制. 注:文章已收录到:https ...

  6. Linux系统学习07-Centos软件安装几种方法

    配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...

  7. char 和 byte 区别

    byte 是字节数据类型 ,是有符号型的,占1 个字节:大小范围为-128-127 . char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 ):大小范围 是0-65535 :char ...

  8. OAuth 2.0授权框架详解

    目录 简介 OAuth的构成 refresh Token Authorization Code模式 隐式授权 Resource Owner 授权密码认证 Client 认证授权 github的OAut ...

  9. 【建议收藏】一份阿里大牛花了三天整理出来的XML学习笔记,写的非常详细

    1. 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输数据,而非显示数据XML 标签没有 ...

  10. 解决Tuxera NTFS for Mac软件安装问题

    在听到小凡的电话说"Tuxera NTFS for Mac软件安装失败,怎么办"的时候,小编心里真像有一万头草泥马在奔腾--苹果软件还能安装失败!? 挥手把一万头草泥马赶走,脑补着 ...