精华内容
下载资源
问答
  • 更新vue版本

    千次阅读 2019-10-04 18:12:22
    npm install -g @vue/cli

    npm install -g @vue/cli

    展开全文
  • vue+webpack 项目更新Vue版本

    千次阅读 2018-06-01 15:39:10
    因业务需求,更新Vue版本和element-UI版本1、首先在用npm update <name> lastest 最新版本,或手动在package.json 直接改版本号/2、然后npm update <name> 会更新至package.json指定...

    因业务需求,更新Vue版本和element-UI版本

    1、首先在用npm update <name> lastest 最新版本,或手动在package.json 直接改版本号/

    2、然后npm update <name>  会更新至package.json指定版本

    3、然后不断提醒你缺少其他依赖,索性就删掉 node_modules  再npm i 了

    npm run dev 就OK了


    展开全文
  • 更新Vue版本:npm install npm@latest -g(可以更新npm至最新版本)对于npm工具,在国内网络会很慢,建议使用npm淘宝镜像 使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm: 执行完之后输入:cnpm...

    更新Vue版本:npm install npm@latest -g(可以更新npm至最新版本


    对于npm工具,在国内网络会很慢,建议使用npm淘宝镜像

     


    使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

     



    执行完之后输入:cnpm -v

     


    此时,vue被提示不是一个命令,输入一下命令执行:

    # (1)全局安装 vue-cli

     

     

     


    然后你就会发现vue已经变成了命令

     

    使用流程

     


    (2)创建一个基于 webpack 模板的新项目

    (正在下载模板)

    新手需要填写的内容:

     


    (3)于是,就多了一个文件夹

     


    bulid   里面是一些操作文件,使用npm run *    时其实执行的就是这里的文件

    config 配置文件,执行文件需要的配置信息

    src   资源文件,所有的组件以及所用的图片都是在这个放着的简单看一下这个文件夹下都放了那些东西


    assets  资源文件夹,放图片之类的资源,components  组件文件夹,写的所有组件都放在这个文件夹下,现在有一个写好的组件已经放到里面了;

    router  路由文件夹,这个决定了页面的跳转规则;

    App.vue应用组件,所有自己写的组件,都是在这个组件之上运行了;

    main.js    webpack入口文件,webpack四大特性entry入口、output输出,loader加载器,plugins插件,可以再项目中build\webpack.base.conf.js第12行看到这个入口文件是哪个。


    (4)下载依赖

     

    如果换成cnpm install会比较快


    (5)项目跑起来!!!

     


    此时就可以输入localhost8080,看到如下界面就算是搭建成功了。

     

     

     


    展开全文
  • 首先要知道nodejs怎么上传文件,如果不会,请移步这里https://blog.csdn.net/qq_38652871/article/details/89641769 没有multiparty的自行安装一下 npm install multiparty 上传文件会了之后这个就简单了,recorder...

    提示:webRTC要https协议或者127.0.0.1或localhost访问,出于安全性考虑

    首先要知道nodejs怎么上传文件,如果不会,请移步这里https://blog.csdn.net/qq_38652871/article/details/89641769
    没有multiparty的自行安装一下

    npm install multiparty
    

    上传文件会了之后这个就简单了,recorder.js就是基于webRTC做的
    ~~
    ~~
    ~~
    ~~看目录
    在这里插入图片描述
    recorder.js的例子只是一个前端的录音和播放等,没涉及到服务端功能,给服务端传啥啊(其实是自己没发现而已),这不行啊,于是就开始读源码,准备改改让其符合自己的需求,结果读完发现,自己要的东西都有了,没必要改了,其实也没啥好改的了,只需要将录音得到的东西传给服务端不就哦了

    突然间发现,其实就是一个录音功能和上传文件并返回文件地址的一个功能,感觉没啥好讲的了,不信你看哈:

    上传的ajax封装好了,只需要调用就行,录音功能recorder.js也封装好了,又是调用,里面也有例子,算了,把我写好的例子放这儿吧

    //app.js
    app.use('/users', usersRouter); //这里添加一个路由,录音完成要上传用的路由
    
    //router/users.js //这里是nodejs服务端保存文件用的 ~em mmm~ 接口
    var express = require('express');
    var path = require('path')
    var router = express.Router();
    var multiparty = require('multiparty');
    var util = require('util');
    var fs = require('fs');
    //这是直接借用了之前的例子,反正报错和不报错都能走到页面,就它了,不要在意细节~~~
    router.get('/',function(req,res,next){
        db.query("select * from user",function(err,rows){
            if(err){
                res.render("users",{title:'用户列表',datas:[],s_name:''});
            }else{
                res.render("users",{title:'用户列表',datas:rows,s_name:''});
            }
        })
    });
    
    router.post('/loadwav', function (req, res, next) {
    	let storagePath = __dirname + '/../public/files/'
    	var form = new multiparty.Form({ uploadDir: storagePath });
    	form.parse(req, function (err, fields, files) {
    		console.log(files, fields);
    		if (err) {
    			console.log('parse error: ' + err);
    			res.status(200).json({ success:false,msg: '上传失败', err, fileUrl: '' });
    			res.end();
    		} else {
    			let inputFile = files.file[0],myDate = new Date();
    			inputFile.originalFilename = 'record'+myDate.getTime()+''+parseInt(Math.random()*1000) + '.' + fields.type
    			let tmpPath = inputFile.path;
    			let backUrl = 'files/'+inputFile.originalFilename;
    			// let finalPath = storagePath + inputFile.originalFilename;
    			let finalPath = __dirname + '/../public/' + backUrl;
    			//移动并重命名为真实文件名
    			fs.rename(tmpPath, finalPath, function (err) {
    				if (err) {
    					console.log('rename error: ' + err);
    				} else {
    					console.log('rename ok');
    				}
    			});
    			res.status(200).json({ success:true,msg: '上传成功', fileUrl: backUrl, err: '' });
    			res.end();
    		}
    
    		// res.writeHead(200, { 'content-type': 'application/json;charset=utf-8' });
    		// res.write('received upload:\n\n');
    	})
    });
    module.exports = router;
    

    下面这个是views/user.ejs模板,没写样式,注意看重点,不要在意细节

    <!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><%= title %></title>
    </head>
    <body>
        <ul id="audioBox"></ul>
        <input type="button" value="录音开启" id="startRecord" />
        <input type="button" value="暂停" id="pauseRecord" />
        <input type="button" value="恢复" id="resumeRecord" />
        <input type="button" value="录音停止" id="endRecord" />
        <input type="button" value="播放录音" id="playRecord" />
        <button id="wavBlobBtn">上传wavblob语音对象</button>
        <h3>
            下载
        </h3>
        <input type="button" value="下载pcm" id="downloadPCM" />
        <input type="button" value="下载wav" id="downloadWAV" />
        <h3>
            录音时长:<span id="time">0</span>s
        </h3>
        <h3>
            声音波形图如下:
        </h3>
        <canvas id="canvas"></canvas>
        <h3>
            加载播放:
        </h3>
        <input type="file" value="加载文件播放" id="uploadAudio" />
        <script src="javascripts/ajax.js"></script>
        <script src="javascripts/recorder.js"></script>
        <script>
            var oDiv = document.getElementById('box'),
            audio = document.getElementById('audio'),
            oTime = document.getElementById('time'),
            recorder = null,
            oCanvas = document.getElementById("canvas"),        // 显示波形的canvas
            ctx = oCanvas.getContext("2d"),
            drawRecordId = null,
            audiObj = document.getElementById('audioTag'),
            ulObj = document.getElementById('audioBox');
            // 按钮事件绑定
            document.getElementById('startRecord').addEventListener('click', startRecord);
            document.getElementById('pauseRecord').addEventListener('click', pauseRecord);
            document.getElementById('resumeRecord').addEventListener('click', resumeRecord);
            document.getElementById('endRecord').addEventListener('click', endRecord);
            document.getElementById('playRecord').addEventListener('click', playRecord);
            document.getElementById('downloadPCM').addEventListener('click', downloadPCM);
            document.getElementById('downloadWAV').addEventListener('click', downloadWAV);
            document.getElementById('uploadAudio').addEventListener('change', uploadAudio);
            document.getElementById('wavBlobBtn').addEventListener('click', getWavBlob);
            // canvas背景初始化
            initCanvasBg()
            // 开始录音
            function startRecord() {
                if (!recorder) {
                    recorder = new Recorder({
                        // 以下是默认配置
                        sampleBits: 16,
                        // sampleRate: 浏览器默认的输入采样率,
                        numChannels: 1,
                    });
                    recorder.onprocess = function(duration) {
                        oTime.innerText = duration;
                    }
                }
                recorder.start();
                // 开始绘制canvas
                drawRecord();
            }
            // 暂停录音
            function pauseRecord() {
                recorder && recorder.pause();
            }
            // 恢复录音
            function resumeRecord() {
                recorder && recorder.resume();
            }
            // 结束录音
            function endRecord (e) {
                recorder && recorder.stop();
                drawRecordId && cancelAnimationFrame(drawRecordId);
                drawRecordId = null;
            }
            // 播放录音
            function playRecord() {
                recorder && recorder.play();
                drawRecordId && cancelAnimationFrame(drawRecordId);
                drawRecordId = null;
            }
            // 下载pcm
            function downloadPCM() {
                recorder && recorder.downloadPCM();
            }
            // 下载wav
            function downloadWAV() {
                recorder && recorder.downloadWAV();
            }
            // canvas波形绘制函数
            function drawRecord() {
                // 用requestAnimationFrame稳定60fps绘制
                drawRecordId = requestAnimationFrame(drawRecord);
                // 实时获取音频大小数据
                var dataArray = recorder.getRecordAnalyseData(),
                    bufferLength = dataArray.length;
                // 填充背景色
                ctx.fillStyle = 'rgb(200, 200, 200)';
                ctx.fillRect(0, 0, canvas.width, canvas.height);
                
                // 设定波形绘制颜色
                ctx.lineWidth = 2;
                ctx.strokeStyle = 'rgb(0, 0, 0)';
                
                ctx.beginPath();
                
                var sliceWidth = canvas.width * 1.0 / bufferLength, // 一个点占多少位置,共有bufferLength个点要绘制
                    x = 0;          // 绘制点的x轴位置
                for (var i = 0; i < bufferLength; i++) {
                    var v = dataArray[i] / 128.0;
                    var y = v * canvas.height / 2;
                
                    if (i === 0) {
                        // 第一个点
                        ctx.moveTo(x, y);
                    } else {
                        // 剩余的点
                        ctx.lineTo(x, y);
                    }
                    // 依次平移,绘制所有点
                    x += sliceWidth;
                }
                
                ctx.lineTo(canvas.width, canvas.height / 2);
                ctx.stroke();
            }
            // canvas背景初始化
            function initCanvasBg() {
                ctx.fillStyle = 'rgb(200, 200, 200)';
                ctx.fillRect(0, 0, canvas.width, canvas.height);
            }
            // 加载音频文件并播放
            function uploadAudio(e) {
                Recorder.playAudio(this.files[0]);
            }
            //获取wavblob对象
            function getWavBlob(){
                recorder && recorder.stop();
                drawRecordId && cancelAnimationFrame(drawRecordId);
                drawRecordId = null;
                let url = 'http://localhost:3000/users/loadwav'; //上传地址
                let wavBlob = recorder.getWAVBlob();
                let formData = new FormData();
                formData.append('file',wavBlob);
                formData.append('name','recorder');
                formData.append('type','wav');
                new Promise((resolve,reject)=>{
                    Ajax({
                        url,
                        data:formData,
                        resolve,
                        reject,
                        headerType:2
                    })
                }).then(function(resp){
                    if(resp.success){
                        let li = document.createElement("li");
                        let audio = document.createElement("audio");
                        li.appendChild(audio);
                        audio.setAttribute("controls","controls");
                        audio.src = resp.fileUrl;
                        ulObj.appendChild(li);
                    }else{
                        alert("发送语音失败")
                    }
                }).catch(function(error){
                    console.log(error);
                })
            }
        </script>
    </body>
    </html>
    

    超级low的demo
    在这里插入图片描述
    总结:写好了以后发现,挺简单挺烂的一个demo,将就看吧,这就是用来实现功能的,然后可以拿到自己的项目里,那时候才是花里胡哨的页面的时候,不喜勿喷哦 (* ̄3 ̄)╭

    2019-06-21更新:
    追加vue版本demo:
    添加对应demo的router就不一 一叙说了,直接看例子,对了,这里的vue版本本地调试还是用的上面的后台

    1. 涉及到跨域问题,上面的服务端app.js添加CORS代码:
    app.all('*', function(req, res, next) {
      console.log('req.url',req.url);
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
      res.header("Content-Type", "application/json;charset=utf-8");
      next();
    });
    
    1. vue添加本地反向代理 如不会请看这里
    '/users': {
    	changeOrigin: true,
    	target: 'http://localhost:3000', //后台反向代理到的地址
    	pathRewrite: {
    		'^users': ''
    	}
    }
    
    1. voice组件,demo专用
    <template>
        <div class="voice">
            <ul class="msg-box">
                <li v-for="(item,index) of voiceList" :key="index">
                    <audio :src="item.fileUrl" controls></audio>
                </li>
            </ul>
            <div class="btn-box">
                <p class="time" v-show="canvasFlag">{{time}}s</p>
                <canvas id="canvas" v-show="canvasFlag"></canvas>
                <el-button type="primary" size="small" @click="startRecord">开始录音</el-button>
                <el-button type="primary" size="small" @click="sendVoice">发送录音</el-button>
            </div>
        </div>
    </template>
    
    <script>
    import Recorder from "@/plugins/recorder.js";
    export default {
        data() {
            return {
                visible: false,
                msgList: [],
                time: 0,
                recorder: null,
                oCanvas: null,
                ctx: null,
                canvasFlag: false,
                drawRecordId: null
            };
        },
        mounted() {
            this.initCanvasBg();
        },
        computed: {
            voiceList() { //这个是获取到语音消息列表之后,利用计算属性给每个语音地址转换成绝对路径地址
                let tmpList = [];
                tmpList = JSON.parse(JSON.stringify(this.msgList));
                tmpList.forEach((el, i) => {
                    el.fileUrl = 'http://localhost:3000/'+el.fileUrl;
                })
                return tmpList;
            }
        },
        methods: {
            startRecord() { //开始录音
                this.canvasFlag = true;
                if (!this.recorder) {
                    this.recorder = new Recorder({
                        // 以下是默认配置
                        sampleBits: 16,
                        numChannels: 1
                    });
                    this.recorder.onprocess = (duration)=> {
                        this.time = duration.toFixed(4);
                    };
                }
                this.recorder.start();
                // 开始绘制canvas
                this.drawRecord();
            },
            sendVoice() { //发送语音消息
                this.canvasFlag = false;
                this.recorder && this.recorder.stop();
                this.drawRecordId && cancelAnimationFrame(this.drawRecordId);
                this.drawRecordId = null;
                let url = "/users/loadwav"; //上传地址
                let wavBlob = this.recorder.getWAVBlob();
                let data = new FormData();
                data.append("file", wavBlob);
                data.append("type", "wav");
                this.$axios
                    .post(url, data, {
                        headers: { "Content-Type": "multipart/form-data" }
                    })
                    .then(res => {
                        if(res.data.success){
                            let tmpObj = {};
                            tmpObj.fileUrl = res.data.fileUrl;
                            this.msgList.push(tmpObj);
                        }else{
                            this.$message({
                                message: "消息发送失败,请重试",
                                type: "warning"
                            });
                        }
                    })
                    .catch(err => {
                        this.$message({
                            message: "消息发送失败,请重试",
                            type: "warning"
                        });
                    });
            },
            initCanvasBg() {
                this.oCanvas = document.getElementById("canvas"); // 显示波形的canvas
                this.ctx = this.oCanvas.getContext("2d");
                this.ctx.fillStyle = "#f5f5f5";
                this.ctx.fillRect(0, 0, this.oCanvas.width, this.oCanvas.height);
            },
            drawRecord() {
                // 用requestAnimationFrame稳定60fps绘制
                this.drawRecordId = requestAnimationFrame(this.drawRecord);
                // 实时获取音频大小数据
                let dataArray = this.recorder.getRecordAnalyseData(),
                    bufferLength = dataArray.length;
                // 填充背景色
                this.ctx.fillStyle = "#f5f5f5";
                this.ctx.fillRect(0, 0, this.oCanvas.width, this.oCanvas.height);
    
                // 设定波形绘制颜色
                this.ctx.lineWidth = 2;
                this.ctx.strokeStyle = "rgba(0, 0, 0, 0.3)";
    
                this.ctx.beginPath();
    
                let sliceWidth = (this.oCanvas.width * 1.0) / bufferLength, // 一个点占多少位置,共有bufferLength个点要绘制
                    x = 0; // 绘制点的x轴位置
                for (let i = 0; i < bufferLength; i++) {
                    let v = dataArray[i] / 128.0;
                    let y = (v * this.oCanvas.height) / 2;
    
                    if (i === 0) {
                        // 第一个点
                        this.ctx.moveTo(x, y);
                    } else {
                        // 剩余的点
                        this.ctx.lineTo(x, y);
                    }
                    // 依次平移,绘制所有点
                    x += sliceWidth;
                }
    
                this.ctx.lineTo(this.oCanvas.width, this.oCanvas.height / 2);
                this.ctx.stroke();
            }
        }
    };
    </script>
    
    <style lang="less" scoped>
    .voice {
        width: 100%;
        height: 100%;
        background: #ffffff;
        padding: 10px;
        .msg-box {
            min-height: 150px;
            max-height: calc(100% - 80px);
            width: 500px;
            overflow-y: auto;
            border: 1px solid #333333;
            margin-bottom: 15px;
        }
        .btn-box {
            position: relative;
            #canvas {
                position: absolute;
                bottom: 40px;
                z-index: 1;
            }
            .time {
                position: absolute;
                bottom: 50px;
                left: 15px;
                z-index: 2;
            }
        }
    }
    </style>
    

    看一下今天这个例子截图,比昨天的漂亮多了
    在这里插入图片描述

    展开全文
  • Vue版本更新

    2021-03-23 11:47:10
    在命令行输入: cnpm install -g @vue/cli 然后在查看vue版本号: vue -V
  • vue版本问题

    千次阅读 2019-01-03 15:01:11
    查看vue版本 vue -V 或者 vue --version 更新vue版本 npm install -g @vue/cli 已被更新到最新版本
  • vue版本更新

    2019-01-07 17:23:00
    之前电脑已经安装 Node环境和 vue-cli脚手架,但是过段时间没有使用,然后现在用 vue-cli 搭建项目的时候,启动服务器的时候报错,无法启动成功,摸索半天,发现是因为 Node和vue-cli 的版本过低,都需要更新更新...
  • vue更新版本

    万次阅读 多人点赞 2018-07-31 15:36:54
    cnpm install -g @vue/cli
  • ↑ 只需在命令行中执行上述语句即可快速更新 Vue 版本,目前是 @vue/cli 4.5.11 注意是 cnpm,如果是 npm 可能报错,输入 vue -V 提示 ‘vue’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 如果之前...
  • Vue版本升级

    2020-04-25 11:37:59
    Vue版本升级 bug 因为vue@2.6.0版本有提供了大量新的功能,所以我想直接用npm升级我自己的vue版本,导致vue-router解析错误。 解决方式 将版本号更新升级为vue@2.6.10,就可以解决vue@2.6.0的vue-router解析的问题 ...
  • 最近在搭建vue框架的时候发现由于vue版本的快速迭代已经与原本般配的webpack产生了隔阂。webpack作为大前端的主流打包工具 如果与之不兼容,会有越来越多的麻烦事情。经过反复测试,得出结论一篇 vue与webpack最佳...
  • 关于更新vue版本,需要先通过 npm uninstall vue-cli -g 或 yarn global remove vue-cli 卸载它。然后全局安装vue-cli命令为: npm install -g @vue/cli Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本,关于...
  • 更新vue/cli到版本4

    2020-10-17 18:25:12
    如果当前vue/cli版本大于3,执行以下命令 npm uninstall @vue/cli -g 如果当前vue-cli版本小于3,执行以下命令 npm uninstall vue-cli -g 2、安装指定版本脚手架 cnpm install -g @vue/cli@版本号 // 如果...
  • 问题起源:想用vue create 命令创建vue项目,但是vue版本是2.9.6,故想把vue版本更新到>3.0的版本。结果运行 npm uninstall -g vue-cli 后,输入vue -V 还是2.9.6,vue仍然存在!!!! 问题解决过程:搜了很多...
  • vue版本以及webpack版本

    万次阅读 2018-04-17 20:33:19
    最近在搭建vue框架的时候发现由于vue版本的快速迭代已经与原本般配的webpack产生了隔阂。webpack作为大前端的主流打包工具 如果与之不兼容,会有越来越多的麻烦事情。 经过反复测试,得出结论一篇 vue与webpack最佳...
  • window.reload是重新加载当前需要的...在APP.vue 中写一个版本号,在静态文件再写一个版本号,相互印证,如果不一样的话,就调用 location.reload() 自动刷新页面 app.vue 代码: var version = this.version; ...
  • vue版本一直是2.9.6版本 问题起源:本来在一个笔记本上起得项目放在码云上,然后还了一个电脑之后直接用sourceTree拉下来之后执行启动命令发现老是报错 更新版本也不行,执行 npm uninstall vue-cli -g 卸载命令...
  • vue后台管理模板 项目描述:基于vue.js + typescript + element-ui编写一套超轻量,可根据实际情况自由地扩展的前端中后台管理基础模板。 vue 2.x | 预览地址 功能清单 layout核心layout模板 vue-router用户权限...
  • 1. 年后第一天上班,因为之前的项目是用vue+vux写的,vue和vux用的... 已经不再维护,所以简单学习一下如何更新vue vux. 2. 所用工具----vue-migration-helper 用法: # 安装vue-migration-helper npm in...
  • 更新vue-cli3x时,遇到问题:vue-cli2版本无法卸载问题解决 Vue官方有关升级Vue-cli3x说明: Vue CLI 的包名称由 vue-cli 改成了 @vue/cli。 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm...
  • vue更新到最新版本

    2020-10-27 19:12:12
    cmd输入命令 npm i -g @vue/cli
  • Mac系统下有写入权限校验所以在执行命令时需要加入sodo Node升级到最新稳定版本: ...@Vue/cli 更新到最新稳定版本 1、先保证Vue已经安装,然后执行下面的命令(注意Mac系统需要加sudo) npm i..
  • vue最新版本

    2020-05-18 20:50:48
    一、vue版本情况 vue最新版本:2.6 vue-cli:最新4.x vue-devtools:5.3.3 vue-cli官网:https://cli.vuejs.org/zh/ 安装vue-cli npm install -g @vue/cli 创建项目 vue create 项目名 或 vue ui 查看vue脚手架的版本...
  • Vue-cli 2.x 升级到Vue-cli3,需要全局卸载2.x版本。命令: npm uninstall vue-cli -g 安装Vue-cli3.x。使用命令(错误示范): npm install -g @vue/cli 使用命令vue -V或者vue --version检查已经安装的版本。...
  • <div><h4>问题描述 <p><strong>1. Checkbox的v-model绑定失效,现在目前只发现这个。</strong></p> 产生环境 使用版本VUE2.5 YDUI0.9.7 设备:Iphone 6s ...ydcss/vue-ydui</p></div>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,595
精华内容 1,038
关键字:

更新vue版本

vue 订阅