webpack学习笔记-Day1
1. webpack概念的引入
- 在网页中会引用哪些常见的静态资源?
- JS
- .js .jsx .coffee .ts (TypeScript)
- CSS
- .css .less .scss
- Images
- .jpg .png .gif .bmp .svg
- 字体文件(Fonts)
- .svg .ttf .eot .woff .woff2
- 模板文件
- .ejs .jade .vue (在webpack中定义组件的方式,推荐使用)
- 网页中引入的静态资源多了以后会有什么问题?
1. 网页加载速度缓慢
2. 要处理错综复杂的依赖关系
- 如何解决上述两个问题?
1. 合并、压缩文件,精灵图、图片的Base64编码
2. 可以使用requireJS,也可以使用 webpack 解决各个包之间的复杂依赖关系
- 什么是webpack?
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
- 如何完美实现上述的两种解决方案?
1. 使用 gulp,是基于 task 任务的(小巧灵活)
2. 使用 webpack, 是基于整个项目进行构建的
- 借助 webpack 这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等功能。
2. node.js 的 path 模块
webpack.config.js 配置文件中 会使用到 path 模块,先来讲一下 path.join() 和 path.resolve() 的区别:
- path.join([path1][, path2][, ...])
用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是"/",Windows系统是"\"。
- path.resolve([from ...], to)
将 to 参数解析为绝对路径,给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径。 例如,给定的路径片段的序列为:/foo、/bar、baz,则调用 path.resolve('/foo', '/bar', 'baz') 会返回 /bar/baz。
const path = require('path');
let path1 = path.resolve(__dirname, '/dist/js') // path.resolve() 一般不要这样写,/dist会覆盖前面的根目录
let path2 = path.resolve(__dirname, './dist/js')
let path3 = path.resolve(__dirname, 'dist/js')
let path4 = path.join(__dirname, 'dist/js')
let path5 = path.join(__dirname, '/dist/js')
let path6 = path.join(__dirname, './dist/js')
let path7 = path.resolve('/foo/bar', '/tmp/file/')
let path8 = path.join('/foo/bar', '/tmp/file/')
2. webpack.config.js 最基本的配置文件
预置条件:安装node
我们先创建一个 webpack-demo 的文件夹,里面有 src 和 dist 两个目录,src 下面创建 js、 css、images、index.html、main.js (入口文件),
- 目录结构如下:
一、初始化: npm init -y (会生成 package.json )
二、webpack 4X 后需要安装webpack-cli : npm install -g webpack-cli
三、安装 jquery: npm i jquery -S (生成 node_modules 文件夹)
注意:在 webpack 中,不要使用 <script> 引入依赖文件,在main.js 入口文件中通过 import xx from xx ( es6语法 )来引用
// index.html 文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="../dist/js/main.js"></script> </head> <body> <ul> <li>这是第1个li</li> <li>这是第2个li</li> <li>这是第3个li</li> <li>这是第4个li</li> <li>这是第5个li</li> <li>这是第6个li</li> <li>这是第7个li</li> <li>这是第8个li</li> </ul> </body> </html>
// main.js 入口文件 import $ from 'jquery' $(function() { console.log($); $('li:odd').css('backgroundColor', 'skyblue'); $('li:even').css('backgroundColor', function() { return '#' + 'D97634'; }); }) /* 1. webpack能处理JS文件的相互依赖关系 * 2. webpack 能处理JS的兼容问题,把高级的、浏览器不能识别的语法,转为低级的能正常识别的语法 * webpack 要打包文件的路径 打包好输出文件的路径 */
// webpack.config.js 文件
const path = require('path');
module.exports = {
mode: 'development', // 打包为开发模式
// 入口配置的对象中,属性为输出的js文件名,属性值为入口文件
entry: {
main: './src/main.js'
}, // 入口文件,从项目根目录指定
output: { // 输出路径和文件名,使用path模块resolve方法将输出路径解析为绝对路径
path: path.resolve(__dirname, '/dist/js'), // 将js打包到dist/js的目录
filename: "[name].js" // 使用[name]打包出来的js文件会分别按照入口文件配置的属性来命名
}
}
- 在浏览器中的效果:
3. webpack-dev-server
- 当我们每次修改了main.js文件后,都需要手动运行 webpack 命令去打包,这样很麻烦,webpack-dev-server 可以解决这个问题。
( 原文链接:https://blog.csdn.net/weixin_43684713/article/details/92839419 )
webpack-dev-server是webpack官方提供的一个小型Express服务器。使用它可以为webpack打包生成的资源文件提供web服务。
webpack-dev-server 主要提供两个功能:
1. 为静态文件提供web服务
2. 自动刷新和热替换(HMR)
自动刷新指当修改代码时webpack会进行自动编译,更新网页内容
热替换指运行时更新各种模块,即局部刷新
- 运行 npm i webpack-dev-server -D 命令,把工具安装到本地的开发依赖
- 由于是在本地安装的, 所以无法直接在 powershell 终端中运行 webpack-dev-server 命令( 只有安装到全局 -g 的才能在终端中运行 )
在 package.json 文件中添加 dev 脚本,直接运行 npm run dev 即可。
在运行过程中报了一个错误,( 解决方法:https://www.cnblogs.com/jeacy/p/13864454.html )
这三个都要有:
现在就可以正常运行 npm run dev 了,直接访问 localhost:8080 即可。点击 src 就能访问 index.html 啦~
注意:如果我们把 index.html 引用 main.js 路径改变成这样,再删掉 dist 目录下的 main.js 文件,会发生什么?
界面效果还是正常显示:
这是为什么呢?
- webpack-dev-server 帮我们打包生成的 main.js 文件,并没有存放到 实际的物理磁盘上,而是直接托管到了电脑内存中,所以我们在项目根目录中,根本找不到这个打包好的 main.js
- 可以认为,webpack-dev-server 把打包和的文件, 以一种虚拟的形式,托管到了 项目的根目录中,虽然看不到,但是可以认为和 dist、src、node_modules 平级,有一个看不见的文件,叫做 main.js
- webpack-dev-server 的常用命令
1. --open :重启服务器 npm run dev,会自动打开浏览器
2. --port 端口号:改变服务器监听的端口
3. --contentBase 指定的根目录
4. --hot: 在改变样式的时候,不会刷新页面( 浏览器的刷新按钮不会变化 ),实现局部刷新