是当下最热门的前端资源模块化管理和打包工具。
- 它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。
- 还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。
- 通过
loader
的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。
Webpack是什么
Webpack是JavaScript应用程序的静态模块打包器
- 逻辑多,文件多,项目的复杂度提高了.就是因为Webpack是打包神器
- Wepack能支持翻译能力
- 可插拔
作用域
全局变量是挂在的在全局对象
上的
- 在windows的全局对象是windows
- 在Mac的全局对象是brower
1 | var a = 1 |
我们在页面上引入的script文件是全局的,因此文件里面的变量也是全局的,这样就有可能造成作用域被污染,变量发生冲突
1 | <script src="/.moduleA.js"></script> |
这时可以考虑使用闭包
1 | // moduleA.js |
第二种写法:
1 | (function(){ |
模块导出机制的演变历史
AMD
asynchronous Module Definition
:异步模块定义
1 | // 第一参数:模块的名字 |
CommonJS
1 | // 通过require函数来引入 |
ES6 Module
1 | // import 导入 |
模块
- 作用域封装
- 重用性
- 接触耦合
Webpack的打包逻辑
- 从入口文件开始,分析整个应用的依赖树
- 将每个依赖模块包装起来,放到一个数组中 等待调用
- 实现模块加载方法,并把它放到模块执行的环境中,确保模块间可以互相调用
- 把执行入口文件的逻辑放在一个函数表达式中,并立即执行这个函数
npm与包管理器
1 | // 初始化包 |
1 | // package.json |
1 | 设置淘宝镜像仓库 |
版本语义化
1.2.3:大版本为1,中版本为2,小版本为3
^version
:中版本中最新的版本^1.0.1
:对于所有形为1.x.x
版本中,1.0.1
是最新的版本
~version
:小版本中最新的版本~1.0.1
:对于所有形为1.0.x
版本中,1.0.1
是最新的版本
npm install的过程
- 寻找包版本信息文件(
package.json
),依照他进行安装 - 查package.json中的依赖,并检查项目中其他的版本信息文件
- 如果发现了新包,就更新版本信息文件
模块系统
- 当今越来越多的网站已经从网页模式进化到了 Webapp 模式。
- webapp通常是一个单页面应用,每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的 JavaScript 代码,这给前端开发的流程和资源组织带来了巨大的挑战。
- 在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统。
- webpack默认的入口就是
src/indesx.js
,默认的出口文件就是dist/main.js
- 如果想要修改的话,就需要修改
webpack.config.js
1 | const path = require("path") |
webpack-dev-server
监听工程目录的改动,动态的打包和更新
webpack中一切皆资源
1 | // webpack.config.js |
1 | import "./style/mycss.css" |
1 |
|
webpack构建react工程
1 | npm init -y |
创建
src
目录,在目录里创建App.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13// App.jsx
import React from "react"
import ReactDom from "react-dom"
const App = () => {
return <div>
<h1>hello world</h1>
</div>
}
export default App
ReactDom.render(<App></App>,document.getElementById("root"))创建
index.html
1
2
3
4
5
6
7
8
9
10
11
12
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello Webpack</title>
</head>
<body>
<div id="root"></div>
</body>
</html>创建
index.jsx
:1
2
3
4
5
6
7
8
9import App from "./App"
if(module.hot) {
module.hot.accept(err => {
if(err) {
console.log("热替换出错")
}
})
}创建babel的配置
方案一:在
package.json
里面填写1
2
3
4
5
6
7
8
9{
"name": "reactdomo",
"version": "1.0.0",
"description": "",
...
"babel": {
"presets": ["@babel/presets-env"]
}
}方案二:创建
.babelrc
文件(优先级比较高)1
2
3{
"preset": ["@babel/presets-env"]
}
编写
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38const HtmlWebPackPlugin = require("html-webpack-plugin")
const path = require("path")
const webpack = require("webpack")
module.exports = {
resolve: {
extensions: [".js", ".jsx", ".json"] // 带有此类后缀的文件,可以不写后缀
},
entry: path.resolve(__dirname, "src/index.jsx"),
module: {
rules: [
{
test: /\.jsx?/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
babelrc: false, // 不使用.babelrc文件
presets: [
require.resolve("@babel/preset-react"),
[require.resolve("@babel/preset-env",{module:false})]
]
}
}
}
]
},
devServer: {
hot: true
},
plugins: [
new HtmlWebPackPlugin({
template: path.resolve(__dirname, "src/index.html"),
filename: "index.html"
}),
new webpack.HotModuleReplacementPlugin()
]
}执行
webpack --mode devlepoment
, 执行webpack-dev-server --open
或者:直接填写package.json
,然后npm install
1 | { |