(资料图)
【相关推荐:javascript视频教程、web前端】
Vue 数据双向绑定原理
Vue 内部通过 Object.defineProperty 方法属性拦截的方式,把 data 对象里每个数据的读写转化成 getter/setter,当数据变化时通知视图更新
MVVM数据的双向绑定
MVVM 数据的双向绑定主要是指,Model 数据变化 View 视图自动渲染展示;View 视图数据变化 Model 数据自动同步更新
Object.defineProperty()
定义
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 ------(引自MDN)
语法
Object.defineProperty(obj, prop, descriptor)
(1)参数
(2)返回值
被传递给函数的对象。
(3)属性描述符
Object.defineProperty() 为对象定义属性,分 数据描述符 和 存取描述符 ,两种形式不能混用。
数据描述符和存取描述符均具有以下可选键值:
4.简单实现案例
<script src="./vue.js"></script> <script> let app = document.getElementById("app") // 声明临时存储变量 let temp = "初始数据" // 数据监听对象 Object.defineProperty(window, "actual", { // 监听读取数据 get() { console.log("获取数据调用"); return temp }, // 监听修改数据 set(value) { console.log("修改数据调用"); temp = value bind(actual) // 数据一旦发生变化就重新渲染页面 } }) // vue 数据双向绑定 function bind(content) { app.innerHTML = content } bind(actual) </script>
vue.config.js配置项
vue-cli3 脚手架搭建完成后,项目目录中没有 vue.config.js 文件,需要手动创建
创建vue.config.js
vue.config.js(相当于之前的webpack.config.js) 是一个可选的配置文件,如果项目的 (和package.json同级的) 根目录中存在这个文件,那么它会被@vue/cli-service自动加载。你也可以使用package.json中的vue字段,但是注意这种写法需要你严格遵照 JSON 的格式来写。
在根目录中创建vue.config.js
vue.config.js配置
这个文件应该导出一个包含了选项的对象:
配置选项
publicPath
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") publicPath: "./",}
把开发服务器架设在根路径,可以使用一个条件式的值:
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 publicPath: process.env.NODE_ENV === "production" ? "" : "/",}
outputDir
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录}
assetsDir
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 assetsDir: "static", // 放置静态资源}
**注:**从生成的资源覆写 filename 或 chunkFilename 时,assetsDir会被忽略。
indexPath
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 // assetsDir: "static", // 放置静态资源 // indexPath: "index.html", // 可以不设置一般会默认}
filenameHashing
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 // assetsDir: "static", // 放置静态资源 // indexPath: "index.html", // 可以不设置一般会默认 // filenameHashing:true, // 文件命名}
pages
其值应该是一个对象,对象的 key 是入口的名字,value 是:
lintOnSave
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 // assetsDir: "static", // 放置静态资源 // indexPath: "index.html", // 可以不设置一般会默认 // filenameHashing:true, // 文件命名 lintOnSave: false, //设置是否在开发环境下每次保存代码时都启用 eslint验证}
runtimeCompiler
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 // assetsDir: "static", // 放置静态资源 // indexPath: "index.html", // 可以不设置一般会默认 // filenameHashing:true, // 文件命名 lintOnSave: false, //设置是否在开发环境下每次保存代码时都启用 eslint验证 // runtimeCompiler: false, // 是否使用带有浏览器内编译器的完整构建版本}
transpileDependencies
productionSourceMap
crossorigin
integrity
Webpack相关配置
configureWebpack
chainWebpack
Css相关配置
css: { // css相关配置 // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中,生产环境下是 true,开发环境下是 false extract: process.env.NODE_ENV === "production", // 是否为 CSS 开启 source map。设置为 true 之后可能会影响构建的性能。 sourceMap: false, // 启用 CSS modules for all css / pre-processor files.(预加载) requireModuleExtension: true, loaderOptions: { sass: { // data: `@import "@/assets/css/variables.scss";` } } },
css.modules(===css.requireModuleExtension)
css.extract
css.sourceMap
css.loaderOptions
支持的 loader 有:
devServer
devServer.proxy
devServer: { port: 2021, // 设置端口号 host: "10.32.120.69", // ip 本地 disableHostCheck: true, //是否关闭用于 DNS 重绑定的 HTTP 请求的 HOST 检查 hotOnly: false, // 热更新 https: false, // https:{type:Boolean}配置前缀 open: false, //配置自动启动浏览器 proxy: null, //设置代理 // proxy: { //目的是解决跨域,若测试环境不需要跨域,则不需要进行该配置 // "/api": { // 拦截以 /api 开头的url接口 // target: "https://api.taobao.cn/", //目标接口域名 // changeOrigin: true, //是否跨域 // ws: true, //如果要代理 websockets,配置这个参数 // secure: false, // 如果是https接口,需要配置这个参数 // // 标识替换 // // 原请求地址为 /api/getData 将"/api"替换""时, // // 代理后的请求地址为: http://xxx.xxx.xxx/getData // // 若替换为"/other",则代理后的请求地址为 http://xxx.xxx.xxx/other/getData // pathRewrite: { // 标识替换 // "^/api": "/" //重写接口 后台接口指向不统一 所以指向所有/ // "^/api": "/api/mock" // } // } // } },
这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用’https://api.taobao.cn/xxx/proxytime=2017-07-07 14:57:22’,直接写‘/api/xxx/proxytime=2017-07-07 14:57:22’即可
import axios from "axios"export default { created() { // 1. 代理成功 // https://api.taobao.cn/users/proxy 转换成 http://localhost:2021/api/users/proxy axios.get("/api/users/proxy").then(res => { // /api 不能少 console.log(res) }) }}
parallel
pwa 学习
pwa: { // serviceWorker:false, // 允许您从一个现有的service worker文件开始,并创建一个该文件的副本,并将“预缓存清单”注入其中。 // workboxPluginMode:"InjectManifest", // workboxOptions: { // //swSrc: "./app/sw.js", /* Empty file. */ // }, iconPaths: { favicon32: "favicon.ico", favicon16: "favicon.ico", appleTouchIcon: "favicon.ico", maskIcon: "favicon.ico", msTileImage: "favicon.ico" } }
pluginOptions
// 这里的webpack配置会和公共的webpack.config.js进行合并module.exports = { // 执行 npm run build 统一配置文件路径(本地访问dist/index.html需"./") // NODE_ENV:Node.js 暴露给执行脚本的系统环境变量。通常用于确定在开发环境还是生产环境 // publicPath: "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/", outputDir: "dist", // 输出文件目录 // assetsDir: "static", // 放置静态资源 // indexPath: "index.html", // 可以不设置一般会默认 // filenameHashing:true, // 文件命名 lintOnSave: false, //设置是否在开发环境下每次保存代码时都启用 eslint验证 // runtimeCompiler: false, // 是否使用带有浏览器内编译器的完整构建版本 configureWebpack: { // 别名配置 resolve: { alias: { //"src": "@", 默认已配置 "assets": "@/assets", "common": "@/common", "components": "@/components", "api": "@/api", "views": "@/views", "plugins": "@/plugins", "utils": "@/utils", } } // 使用前面可加~ }, productionSourceMap: false, //如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建 css: { // css相关配置 // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中,生产环境下是 true,开发环境下是 false extract: process.env.NODE_ENV === "production", // 是否为 CSS 开启 source map。设置为 true 之后可能会影响构建的性能。 sourceMap: false, // 启用 CSS modules for all css / pre-processor files.(预加载) requireModuleExtension: true, loaderOptions: { sass: { // data: `@import "@/assets/css/variables.scss";` } } }, devServer: { port: 2021, // 设置端口号 host: "10.32.120.69", // ip disableHostCheck: true, //是否关闭用于 DNS 重绑定的 HTTP 请求的 HOST 检查 hotOnly: false, // 热更新 https: false, // https:{type:Boolean}配置前缀 open: false, //配置自动启动浏览器 proxy: null, //设置代理 // proxy: { //目的是解决跨域,若测试环境不需要跨域,则不需要进行该配置 // "/api": { // 拦截以 /api 开头的url接口 // target: "https://api.taobao.cn/", //目标接口域名 // changeOrigin: true, //是否跨域 // ws: true, //如果要代理 websockets,配置这个参数 // secure: false, // 如果是https接口,需要配置这个参数 // // 标识替换 // // 原请求地址为 /api/getData 将"/api"替换""时, // // 代理后的请求地址为: http://xxx.xxx.xxx/getData // // 若替换为"/other",则代理后的请求地址为 http://xxx.xxx.xxx/other/getData // pathRewrite: { // 标识替换 // "^/api": "/" //重写接口 后台接口指向不统一 所以指向所有/ // "^/api": "/api/mock" // } // } // } }, // 这个插件中添加的service worker只在生产环境中启用(例如,只有当你运行npm run build或yarn build时)。 // 不推荐在开发模式中启用service worker,因为它会导致使用以前缓存的资产而不包括最新的本地更改的情况。 pwa: { // serviceWorker:false, // 允许您从一个现有的service worker文件开始,并创建一个该文件的副本,并将“预缓存清单”注入其中。 // workboxPluginMode:"InjectManifest", // workboxOptions: { // //swSrc: "./app/sw.js", /* Empty file. */ // }, iconPaths: { favicon32: "favicon.ico", favicon16: "favicon.ico", appleTouchIcon: "favicon.ico", maskIcon: "favicon.ico", msTileImage: "favicon.ico" } }}
【相关推荐:javascript视频教程、web前端】
以上就是vue数据双向绑定与vue.config.js文件配置详解的详细内容,更多请关注php中文网其它相关文章!