2.8搭建服务
2.8.1那么我们要想为什么要搭建本地服务器呢?
-
可以提高开发效率,当文件发生变化时,可以自动的完成编译和展示
-
自动编译,webpack提供了以下几种方式
- webpack watch mode;
- webpack-dev-server(常用);
- Web pack-dev-middleware(不常用)
-
webpack给我们提供了watch模式:
- 在该模式下,webpack依赖图中的所有文件,只要有文件发生了更新,代码会被重新编译.
- 我们不需要手动去运行 npm run build指令了
2.8.2:搭建方式
-
开启watch模式两种方式
-
方式一:在导出的配置中,添加 watch: true;
//package.json { "scripts": { "build":"webpack --watch" //通过webpack-cli来进行检查 }, }//webpack.config.js module.export = { watch:true } -
方式二:在启动webpack的命令中,添加 --watch的标识;
-
不会进行源代码打包生成目标代码
-
但是会把打包后的源代码存放在内存中然后express去读取内存在的代码
-
事实上webpack-dev-server使用了一个库叫memfs(memory-fs webpack自己写的)
npm install webpack-dev-server -D//package.json { "scripts": { "build":"webpack --watch" //通过webpack-cli来进行检查 "serve":"webpack serve"//通过webpack-cli来进行检查帮助解析启动本地服务 }, }
-
2.8.3:关于devserver的配置
1.设置devserver指定文件位置
//webpack.config.js
module.exports = {
devserver: {
contentBase:"./abc" //会去文件中查找对应的资源,只要指定谁就去找谁,一般都是区配置./public
}
}
2.在index.html中指定一个script标签
<!-- index.html -->
<script src="./abc.js"></script>
3.创建文件夹abc/abc.js文件
//abc.js
console.log("abc")
2.8.4热更新(hot module replacement)
module.exports = {
target:"web",//为什么打包的 为web打包
devServer: {
contentBase:"./public",
hot:true
}
}
以上代码还没有达到热更新所以要进行接下来的一些操作
//main.js
import { createApp } from 'vue';
import axios from 'axios';
import App from '@/vue/App';
import "./js/element";
if (module.hot) {
module.hot.accept("./js/element.js", () => {
console.log("element模块发生更新了");
})
}
console.log(sum(20, 30));
console.log(priceFormat());
const app = createApp(App);
app.mount("#app");
注意 vue-loader已经支持vue的HMR,提供开箱即用无需以上这样的配置
2.8.5:HMR原理
2.8.6:hotOnly,host配置
-
host设置主机地址:
- 默认值是localhost;
- 如果希望其他地方也可以访问,可以设置为 0.0.0.0;
-
localhost 和 0.0.0.0 的区别:
-
localhost:本质上是一个域名,通常情况下会被解析成127.0.0.1;
-
127.0.0.1:回环地址(Loop Back Address),表达的意思其实是我们主机自己发出去的包,直接被自己接收;
正常的数据库包经常 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层 ;
而回环地址,是在网络层直接就被获取到了,是不会经常数据链路层和物理层的;
比如我们监听 127.0.0.1时,在同一个网段下的主机中,通过ip地址是不能访问的;
-
-
0.0.0.0:监听IPV4上所有的地址,再根据端口找到不同的应用程序;
比如我们监听 0.0.0.0时,在同一个网段下的主机中,通过ip地址是可以访问的;
//webpack.config.js
devServer: {
host:"0.0.0.0", //主机地址
port:8000// 端口号
open:true //自动打开浏览器
compress:true //gizp压缩 -> 压缩可以更快传输到浏览器,浏览器会查看是不是gzip会进行解压,html不进行压缩
}
2.8.7:代理
-
target:表示的是代理到的目标地址,比如 /api-hy/moment会被代理到 http://localhost:8888/api-
hy/moment;
-
pathRewrite:默认情况下,我们的 /api-hy 也会被写入到URL中,如果希望删除,可以使用pathRewrite;
-
secure:默认情况下不接收转发到https的服务器上,如果希望支持,可以设置为false;
-
changeOrigin:它表示是否更新代理后请求的headers中host地址;
//webpack.config.js
devserver : {
"/api": {
target:"http://localhost:8000",
pathRewrite: {
"^/api":""
},
secure:false,
changeOrigin:true
}
}
2.9resolve模块解析
- 如果文件具有扩展名,则直接打包文件;
- 否则,将使用 resolve.extensions选项作为文件扩展名解析;
- 会在文件夹中根据 resolve.mainFiles配置选项中指定的文件顺序查找;
- esolve.mainFiles的默认值是 ['index'];
- 再根据 resolve.extensions来解析扩展名;
- 默认值是 ['.wasm', '.mjs', '.js', '.json'];
- 所以如果我们代码中想要添加加载 .vue 或者 jsx 或者 ts 等文件时,我们必须自己写上扩展名;
- 项目的目录结构比较深的时候,或者一个文件的路径可能需要 ../../../这种路径片段;
- 我们可以给某些常见的路径起一个别名;
//webpack.config.js
module.exports = {
resolve: {
extensions:[".js","json",".mjs",".vue"],
alias: {
"@":patj.resolve(__dirname,"./src")
"js":path.resolve(__dirname,"./src/js")
}
}
}