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. JSON&AJAX

    JSON 定义:JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式.它基于 ECMAScript(欧洲计算机协会制定的 JS 规范)的一个子集 ...

  2. Java的图形打印

    1.菱形 复制代码 package Java_Learn.File; public class Main1 { public static void main(String[] args) { pri ...

  3. 2. Hive常见操作命令整理

    该笔记主要整理了<Hive编程指南>中一些常见的操作命令,大致如下(持续补充中): 1. 查看/设置/修改变量2. 执行命令3. 搜索相关内容4. 查看库表信息5. 创建表6. 分区7. ...

  4. SQL 查找"存在",别再用 count 了,很耗费时间的!

    根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢? 无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的 ...

  5. 协程实现socket并发编程

    在python中多线程其实是被弱化了,因为由于GIL的原因,同一时间只有一个线程能访问CPU,即使你的CPU是多核的在python中因为多线程被弱化了,所以协程显的重要,能够在一个线程中提高CPU的利 ...

  6. Java(6)集合

    一.Java集合框架概述 1.什么是集合 集合框架:用于存储数据的容器. 数组.集合等存储数据的结构,叫Java容器. 此时的存储,是指内存层面的存储,不涉及持久化的存储. 任何集合框架都包含三大块的 ...

  7. cmd编译java代码为什么总是说找不到main方法;请园子里大神指点迷津!!!

    编写源代码如下: cmd,编译路径:E: cd Notepad cd src javac Character.java jvav Character 运行结果: 实在是找不到问题点,请评论区给予指导啊 ...

  8. 如何调整MathType公式的字体大小

    作为一名理科生,想必大家都在为编辑公式而烦恼,在Word中要想完美插入公式,还真不是那么简单的.首先要使用专业的公式编辑器MathType,其次还要对公式的大小进行修改,这样才能看起来是相融合的文章. ...

  9. Vegas教程:教你制作抖音热门人物穿越门窗特效

    抖音上经常会有很多特效视频,例如换妆.分镜.合拍.放大等,合适的特效总是会让视频更加出彩.这些特效,除了一部分是抖音自带以外,很多都是用的其他视频特效软件制作而成.这些视频编辑软件操作简单易上手,强大 ...

  10. MGR(MySQL Group Replication)部署测试

    1. 环境说明 192.168.11.131 mgr1 主节点 192.168.11.132 mgr2 从节点 192.168.11.133 mgr3 从节点 2. 在mgr1.mgr2.mgr3上安 ...