概念(是什么?)
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。(摘抄来自webpack中文网)
能做什么?
1. webpack能够处理JS之间的依赖关系
2. webpack能够处理JS的兼容问题;把高级的浏览器不识别的如法(eg:ES6),转为“低级的” 浏览器能够识别的语法;
怎么做?
案例
1. 首先你的环境需要安装node.js
PS D:\webpack-study\csdnweb> node -v
v8.11.3
PS D:\webpack-study\csdnweb>
2. 新建一个文件夹,用vscode打开,终端中运行 npm init -y 命令初始化项目;运行命令之后,在项目根目录中会生成一个package.json文件;
PS D:\webpack-study\csdnweb> npm init -y
Wrote to D:\webpack-study\csdnweb\package.json:
{
"name": "csdnweb",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
PS D:\webpack-study\csdnweb>
3. 下载webpack ; 运行命令 npm i webpack@3.6.0 --save-dev (选择稳定版本3.6.0)
PS D:\webpack-study\csdnweb> npm i webpack@3.6.0 --save-dev
> uglifyjs-webpack-plugin@0.4.6 postinstall D:\webpack-study\csdnweb\node_modules\uglifyjs-webpack-plugin
> node lib/post_install.js
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ webpack@3.6.0
added 331 packages in 20.473s
PS D:\webpack-study\csdnweb>
4. 运行命令:npm i babel babel-core babel-loader babel-preset-es2015 babel-preset-stage-0 --save-dev
PS D:\webpack-study\csdnweb> npm i babel babel-core babel-loader babel-preset-es2015 babel-preset-stage-0 --save-dev
npm WARN deprecated babel-preset-es2015@6.24.1: ???? Thanks for using Babel: we recommend using babel-preset-env now: please read babeljs.io/env to update!
npm WARN deprecated babel@6.23.0: In 6.x, the babel package has been deprecated in favor of babel-cli. Check https://opencollective.com/babel to support the Babel maintainersnpm WARN babel-loader@8.0.6 requires a peer of @babel/core@^7.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ babel-preset-stage-0@6.24.1
+ babel-preset-es2015@6.24.1
+ babel-loader@8.0.6
+ babel-core@6.26.3
+ babel@6.23.0
added 124 packages in 9.917s
PS D:\webpack-study\csdnweb>
5. 在项目根目录下建一个名称为“.babelrc”的文件,文件内容为
{"presets":["es2015","stage-0"]}
6. 为了让webpack打包时识别css,运行一下命令:npm i css-loader style-loader less less-loader --save-dev
PS D:\webpack-study\csdnweb> npm i css-loader style-loader less less-loader --save-dev
npm WARN babel-loader@8.0.6 requires a peer of @babel/core@^7.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN css-loader@2.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ css-loader@2.1.1+ less-loader@5.0.0
+ less@3.9.0
+ style-loader@0.23.1
added 82 packages in 10.052s
PS D:\webpack-study\csdnweb>
7. 为了识别文件和路径,运行一下命令:npm i url-loader file-loader --save-dev
PS D:\webpack-study\csdnweb> npm i url-loader file-loader --save-dev
npm WARN babel-loader@8.0.6 requires a peer of @babel/core@^7.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN css-loader@2.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN file-loader@3.0.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})+ file-loader@3.0.1
+ url-loader@1.1.2
added 3 packages in 34.887s
PS D:\webpack-study\csdnweb>
PS D:\webpack-study\csdnweb>
8. 安装插件,运行命令:npm i html-webpack-plugin --save-dev
PS D:\webpack-study\csdnweb> npm i html-webpack-plugin --save-dev
npm WARN babel-loader@8.0.6 requires a peer of @babel/core@^7.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN css-loader@2.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN file-loader@3.0.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})+ html-webpack-plugin@3.2.0
added 47 packages in 7.313s
PS D:\webpack-study\csdnweb>
9. 根目录新建src,src下有文件夹js,css,images;以及文件index.html, main.js;
a > js/AAA.js
/* jshint esversion: 6 */
export let str = "good good study, day day up";
b > css/style.css
html,body{
margin: 0;
padding: 0;
background-color: gainsboro;
width: 100%;
height: 100%;
}
c > css/style1.less
body{
#aaa{
color: red;
}
}
d > images文件夹中放入一张图片名称为1.jpg
e > src/index.html
<!DOCTYPE html>
<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>Document</title>
</head>
<body>
<div id="aaa"></div>
</body>
</html>
f > src/main.js
/* jshint esversion: 6 */
import {str} from "./js/AAA.js";
import "./css/style1.less";
import "./css/style.css";
import imgSrc from "./images/1.jpg";
let img = new Image();
img.src=imgSrc;
img.onload=function(){
document.body.appendChild(img);
};
let aaa = document.getElementById("aaa");
aaa.innerHTML = str;
console.log(str);
10. 根目录下创建 webpack.config.js
/* jshint esversion: 6 */
// html-webpack-plugin 作用
/*1. 自动在内存中根据指定页面生成一个内存的页面
2. 自动把打包好的(index.html中引用的)js追加到页面中去*/
let HtmlWebpackPlugin=require("html-webpack-plugin");
var path = require('path');
module.exports = {
entry:"./src/main.js",
output:{
filename:'build.js',
path: path.resolve(__dirname, './dist')
},
module:{ // 这个节点用于配置加载第三方模块的加载器
rules:[ // 所有第三方的规则
{test:/\.js$/,use:["babel-loader"],exclude:/node_modules/},
{test:/\.css$/,use:["style-loader","css-loader"]},
{test:/\.less$/,use:["style-loader","css-loader","less-loader"]},
{test:/\.(jpg|gif|png|jpeg)$/i,use:["url-loader?limit=5120"]}
]
},
plugins:[ // 创建一个在内存中生成html 页面的插件
new HtmlWebpackPlugin({template:"./src/index.html"})
]
}
11. 修改生成的package.json,把scripts属性修改如下
{
"name": "csdnweb",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel": "^6.23.0",
"babel-core": "^6.26.3",
"babel-loader": "^8.0.6",
"babel-preset-es2015": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
"css-loader": "^2.1.1",
"file-loader": "^3.0.1",
"html-webpack-plugin": "^3.2.0",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"style-loader": "^0.23.1",
"url-loader": "^1.1.2",
"webpack": "^3.6.0"
}
}
12. 运行命令npm run build 发现报错
PS D:\webpack-study\csdnweb> npm run build
> csdnweb@1.0.0 build D:\webpack-study\csdnweb
> webpack
Hash: 953519a8b456c6d39f1e
Version: webpack 3.6.0
Time: 559ms
Asset Size Chunks Chunk Names
build.js 5.01 kB 0 [emitted] main
index.html 349 bytes [emitted]
[0] ./src/main.js 2.54 kB {0} [not cacheable] [built] [failed] [1 error]
ERROR in ./src/main.js
Module build failed: Error: Cannot find module '@babel/core'
babel-loader@8 requires Babel 7.x (the package '@babel/core'). If you'd like to use Babel 6.x ('babel-core'), you should install 'babel-loader@7'.
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (D:\webpack-study\csdnweb\node_modules\babel-loader\lib\index.js:10:11)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at loadLoader (D:\webpack-study\csdnweb\node_modules\loader-runner\lib\loadLoader.js:18:17)
at iteratePitchingLoaders (D:\webpack-study\csdnweb\node_modules\loader-runner\lib\LoaderRunner.js:169:2)
at runLoaders (D:\webpack-study\csdnweb\node_modules\loader-runner\lib\LoaderRunner.js:365:2)
at NormalModule.doBuild (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModule.js:182:3)
at NormalModule.build (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModule.js:275:15)
at Compilation.buildModule (D:\webpack-study\csdnweb\node_modules\webpack\lib\Compilation.js:149:10)
at moduleFactory.create (D:\webpack-study\csdnweb\node_modules\webpack\lib\Compilation.js:447:10)
at factory (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModuleFactory.js:241:5)
at applyPluginsAsyncWaterfall (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModuleFactory.js:94:13)
at D:\webpack-study\csdnweb\node_modules\tapable\lib\Tapable.js:268:11
at NormalModuleFactory.params.normalModuleFactory.plugin (D:\webpack-study\csdnweb\node_modules\webpack\lib\CompatibilityPlugin.js:52:5)
at NormalModuleFactory.applyPluginsAsyncWaterfall (D:\webpack-study\csdnweb\node_modules\tapable\lib\Tapable.js:272:13)
at resolver (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModuleFactory.js:69:10)
at process.nextTick (D:\webpack-study\csdnweb\node_modules\webpack\lib\NormalModuleFactory.js:194:7)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
Child html-webpack-plugin for "index.html":
1 asset
[0] ./node_modules/html-webpack-plugin/lib/loader.js!./src/index.html 510 bytes {0} [built]
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] (webpack)/buildin/module.js 517 bytes {0} [built]
+ 1 hidden module
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! csdnweb@1.0.0 build: `webpack`
npm ERR! Exit status 2
npm ERR!
npm ERR! Failed at the csdnweb@1.0.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2019-05-15T13_35_03_583Z-debug.log
PS D:\webpack-study\csdnweb>
13. 根据提示运行命令 npm i babel-loader@7
PS D:\webpack-study\csdnweb> npm i babel-loader@7
npm WARN css-loader@2.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN file-loader@3.0.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ babel-loader@7.1.5
removed 6 packages and updated 5 packages in 6.895s
PS D:\webpack-study\csdnweb>
13. 再次运行命令npm run build
PS D:\webpack-study\csdnweb> npm run build
> csdnweb@1.0.0 build D:\webpack-study\csdnweb
> webpack
Hash: edbfe9c65ba5664ca8b9
Version: webpack 3.6.0Time: 1871ms
Asset Size Chunks Chunk Names
1d9708d6a778bd9a21fae174f82156f6.jpg 9.32 kB [emitted]
build.js 23 kB 0 [emitted] main
index.html 349 bytes [emitted]
[2] ./src/main.js 339 bytes {0} [built]
[3] ./src/js/AAA.js 73 bytes {0} [built]
[4] ./src/css/style1.less 1.23 kB {0} [built]
[5] ./node_modules/css-loader/dist/cjs.js!./node_modules/less-loader/dist/cjs.js!./src/css/style1.less 173 bytes {0} [built]
[7] ./src/css/style.css 1.09 kB {0} [built]
[8] ./node_modules/css-loader/dist/cjs.js!./src/css/style.css 271 bytes {0} [built]
[9] ./src/images/1.jpg 82 bytes {0} [built]
+ 3 hidden modules
Child html-webpack-plugin for "index.html":
1 asset
[0] ./node_modules/html-webpack-plugin/lib/loader.js!./src/index.html 510 bytes {0} [built]
[2] (webpack)/buildin/global.js 509 bytes {0} [built]
[3] (webpack)/buildin/module.js 517 bytes {0} [built]
+ 1 hidden module
PS D:\webpack-study\csdnweb>
14. 在根目录生成的dist文件夹中,有个index.html;访问结果如下
这样我们webpack的环境就搭建好了;在刚开始学习的时候,会碰到各种版本的问题,令人很苦恼;在之后学习了vue-cli之后,那个时候会非常容易;
但是现在还是有一个问题;进行到14步的时候,我们实现了用wabpack打包;但是我们在开发环境中,是不需要打包的,只需要在代码开发完成之后,才会选择打包;而且在实际的开发中,总是修改了一行代码就需要看效果;这种方式岂不是很麻烦?那就接着看吧;
15. 安装 webpack-dev-server ;运行命令:npm i webpack-dev-server@2.11.1 --save-dev
PS D:\webpack-study\csdnweb> npm i webpack-dev-server@2.11.1 --save-dev
npm WARN css-loader@2.1.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN file-loader@3.0.1 requires a peer of webpack@^4.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN csdnweb@1.0.0 No description
npm WARN csdnweb@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ webpack-dev-server@2.11.1
added 194 packages in 15.219s
PS D:\webpack-study\csdnweb>
16. 修改package.json
"scripts": {
"build": "webpack",
"dev":"webpack-dev-server --open --port 8899" // 添加新内容
}
命令 "webpack-dev-server --open --port 8899" 中,加上指令 "--open" 是在运行 "npm run dev" 时,自动打开网页;"--port 8899" 是为服务指定启动端口号;还有一个"-hot" 热加载的指令;
17. 运行npm run dev ,你就会看到和上面一样的网页;