Webpack

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Webpack相关的知识,希望对你有一定的参考价值。

目录

1.什么是Webpack?

一个现代的javascript应用的静态模块打包工具
webpack中的模块化
目前使用前端模块化的方案:AMD、CMD、CommonJS、ES6
但是,这些方案有的浏览器是不支持的
webpack能够提供一些底层支撑,将你写的代码转化成大多数浏览器能识别的代码
并且,webpack还帮助我们处理模块间的依赖关系
不仅仅是javaScript文件,我们的CSS、图片、json文件在webpack中都可以被当做模块来使用
打包如何理解?
将webpack中的各种资源模块进行打包合并成一个或多个包(Bundle)
并且,在打包的过程中,还可以对资源进行处理,比如压缩图片,将scss转成css,将ES6语法转成ES5语法,将TypeScript转成转成JavaScript等等

2.和grunt/gulp的对比

grunt/gulp的核心是Task,我们通过定义一系列的Task来处理一些事物(例如ES6、ts转化、图片压缩)
之后让grunt/gulp依次来执行这些Task,让整个流程自动化
所以,grunt/gulp也被称为前端自动化任务管理工具
grunt/gulp强调前端流程的自动化,模块化不是它的核心

3.Webpack的安装

Webpack为了可以正常运行,必须依赖node环境
node环境为了可以正常执行很多代码,其中必须包含各种依赖的包
使用npm(node packages manager)工具可以更好地管理这些包
安装
先安装node.js
在cmd中查看node版本 node -v
全局安装webpack(3.6.0)
npm install webpack@3.6.0 -g

4.基本使用

具体步骤
在src中写好js代码之后
执行打包指令:webpack ./src/main.js ./dist/bundle.js
打包后的bundle.js放在dist文件夹中
之后index.html中只需要引用bundle.js
index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<script src="./dist/bundle.js"></script>
</body>
</html>

main.js

//1.使用commonjs的模块化规范
const {add, mul} = require('./mathUtil.js')

console.log(add(2,3));
console.log(mul(5,6));

//2.使用ES6的模块化规范
import {name,age,height} from "./info";

console.log(name);
console.log(age);
console.log(height);

mathUtil.js

function add(num1,num2){
  return num1 + num2
}

function mul(num1,num2){
  return num1 * num2
}

module.exports = {
  add,
  mul
}

info.js

export const name = "fyx";
export const age = 20;
export const height = 1.75;

测试结果

5.配置webpack.config.js

目标:通过在控制台执行一句webpack,自动打包
我们需要创建webpack.config.js文件来实现我们的目标
这个文件怎么写看下面代码
在配置的过程中,需要用到node里面的包,所以我们还要配置package.json文件
控制台执行npm init,初始化完成后自动在项目的根目录下生成package.json文件,这个文件它定义了这个项目的配置信息以及所需要的各种模块
通过npm install这个命令,能自动下载所需的模块

在上面的基础上,添加
webpack.config.js

const path = require('path')  //从node包里面找path,path其实是一个模块

module.exports={
  entry:'./src/main.js',     //入口
  output: {     //出口
    path: path.resolve(__dirname, 'dist'),//动态获取路径
    filename:'bundle.js'
  }
}

动态获取路径的时候用到了resolve函数
resolve函数用来做路径的拼接,__direname是node里面的全局变量,存放当前文件的路径,拼接起来就是文件的绝对路径
这样做是因为path后面需要跟文件的绝对路径

自动生成的package.json

{
  "name": "meetwebpack",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

执行打包命令

现在,我想做一个打包命令的映射
比如说,让指令npm run build等同于webpack,怎么搞?
做法:在package.json文件中的scripts后面添加"build": “webpack”,如下:

{
  "name": "meetwebpack",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \\"Error: no test specified\\" && exit 1",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC"
}

用npm run还有个特点:它会优先使用本地的webpack
如果在Terminal中执行直接用webpack指令,它会默认使用全局的webpack,但有时候我们本地需要依赖的webpack版本和全局的不一致
所以,我们往往要安装本地webpack
指令:npm install webpack@3.6.0 --save-dev
–save-dev表示这是开发时依赖,就是说项目打包后不需要再使用的
安装后当前项目会多出一个这个文件夹:

以上是关于Webpack的主要内容,如果未能解决你的问题,请参考以下文章

Vue报错:Uncaught TypeError: Cannot assign to read only property 'exports' of object 的解决方法(代码片段

如何使用webpack加载库源映射?

浅析 -- webpack

报错:✘ http://eslint.org/docs/rules/indent Expected indentation of 0 s paces but found 2(代码片段

报错:✘ http://eslint.org/docs/rules/indent Expected indentation of 0 s paces but found 2(代码片段

无法创建中继容器; graphql.js 文件似乎有 webpack 工件?