全栈开发一(webpack+gulp构建vue前端开发环境)

最近把学习了一把vue这个前端框架,现在来写一关于开发vue项目的教程。我们会用mongdb+node作后台,vue作前端,构建一个简单企业型的一个网站。

构建vue前端开发环境

一、安装node.js;

进入http://nodejs.cn/选择自己系统所对应的node版本下载,个人推荐最新的8.4版本。

二、安装淘宝镜像

打开终端,window运行cmd 输入

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

为什么安装这个呢?很多人都说用npm就行了,其实主要是我们国家的网络问题,很多外国的网站都会被墙掉,不翻墙访问不到,所以我们安装这个镜像是方便我们下载依赖包;

三、建立项目

在你在系统中建立一个文件夹,用来存放你的源代码我的是window系统,我在 e盘中建立了一个vueteam下面是我的终端代码:

C:\Users\19955
λ e:

E:\
λ cd /node/vueteam

E:\node\vueteam
λ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (vueteam) vueteam
version: (1.0.0) 1.0.1
description: 全栈开发项目
entry point: (index.js)
test command: 介绍信息
git repository:
keywords:
author: 蓝诀
license: (ISC)
About to write to E:\node\vueteam\package.json:

{
  "name": "vueteam",
  "version": "1.0.1",
  "description": "全栈开发项目",
  "main": "index.js",
  "scripts": {
    "test": "介绍信息"
  },
  "author": "蓝诀",
  "license": "ISC"
}


Is this ok? (yes)

上面代码主要是建立package.json,用来放置所有依赖

四、安装webpack(2.x) 与 gulp(4.0)

cnpm install webpack@2.6.0 -g   //全局安装webpack
cnpm install gulpjs/gulp#4.0 -g   //全局安装gulp



在package.json

{
  "name": "vueteam",
  "version": "1.0.1",
  "description": "全栈开发项目",
  "main": "index.js",
  "scripts": {
    "test": "介绍信息"
  },
  "author": "蓝诀",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-plugin-syntax-dynamic-import": "^6.18.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "babel-preset-stage-1": "^6.24.1",
    "babel-preset-stage-2": "^6.24.1",
    "babel-preset-stage-3": "^6.24.1",
    "connect-rest": "^1.9.5",
    "del": "^3.0.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "gulp": "gulpjs/gulp#4.0",
    "gulp-autoprefixer": "^3.1.0",
    "gulp-cached": "^1.1.0",
    "gulp-cli": "^1.2.2",
    "gulp-concat": "^2.6.0",
    "gulp-connect": "^5.0.0",
    "gulp-less": "^3.1.0",
    "gulp-minify-css": "^1.2.4",
    "gulp-plumber": "^1.1.0",
    "gulp-remember": "^0.3.1",
    "gulp-rename": "^1.2.2",
    "gulp-replace": "^0.5.4",
    "gulp-uglify": "^3.0.0",
    "gulp-util": "^3.0.7",
    "gulp-webpack": "^1.5.0",
    "highlight.js": "^9.11.0",
    "less": "^2.7.2",
    "less-loader": "^4.0.3",
    "less-plugin-clean-css": "^1.5.1",
    "vue": "^2.3.3",
    "vue-loader": "^12.1.1",
    "vue-router": "^2.5.3",
    "vue-style-loader": "^3.0.1",
    "vuex": "^2.3.1",
    "webpack": "^2.6.1",
    "vue-cli": "^2.8.2"
  }
}

然后在终端中输入

cnpm install

等安装完成

五、配置webpack

在根目录建立一个webpack.config.js的文件

var path = require('path');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var webpack = require('webpack');
module.exports = function () {
    return {
        "resolve": {
            "extensions": [ //省略的文件名后缀
                ".ts",
                ".js",
                ".vue"
            ],
            "modules": [
                "./node_modules"  //依赖模块目录

            ],
            "symlinks": true
        },
        entry: {
            index: './src/index.js', //入口

            //vendor: 'moment'  第三方js 也就是独立出来的包,比如jquery, echart
        },
        output: {
            filename: '[name].js', //编译的文件名
            publicPath: '/js/',//抽出的静态文件出来,可不用管,我打算用gulp处理静态文件
            path: path.resolve(__dirname, 'dist/js'),//编译代码后的路径
        },
        module: {
            //编译的规则
            rules: [{   //vue文件编译
                test: /\.vue$/,
                loader: 'vue-loader'

            }, {
                test: /\.css$/,  //css文件编译
                use: ExtractTextPlugin.extract({
                    use: 'css-loader'
                })
            }, {
                test: /\.js/,
                loader: 'babel-loader', //js文件编译
                exclude: /(node_modules)/,
                query: {
                    presets: ['es2015', 'stage-3']  //js文件编译使用的包,stage-3是一个es译版本,目前最新是stage-3
                }
            },
            {
                test: /\.less$/,    //编译vue里的less样式
                loader: 'less-loader'
            },
            {
                test: /\.(png|jpg|gif)$/,  //编译样式里的静态文件
            loader: 'url-loader',
                query: {
                // 把较小的图片转换成base64的字符串内嵌在生成的js文件里
                limit: 10000,
                // 路径要与当前配置文件下的publicPath相结合
                name: '../style/[name].[ext]?[hash:7]'
            }
                },
                {
        test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/, //css文字
            loader: 'file-loader',
                query: {
            // 把较小的图标转换成base64的字符串内嵌在生成的js文件里
            limit: 10000,
                name:'../fonts/[name].[ext]?[hash:7]',
                    prefix:'font'
        }
    },

            ]
},
    plugins: [
        //new ExtractTextPlugin('../style/styles.css'), //抽出 css
        // new webpack.optimize.UglifyJsPlugin({  //压缩js
        //   compress: {
        //     warnings: false
        //   }
        // })

    ]
    }
}

六、配置gulp,在根目录建立gulpfile.js文件,代码如下

var gulp = require("gulp"); //本地安装gulp所用到的地方
var gutil = require("gulp-util");
var del = require("del"); //删除文件
var less = require('gulp-less'); //less语法
var concat = require("gulp-concat"); //合并
var minifycss = require('gulp-minify-css'); //压缩css
var autoprefixer = require('gulp-autoprefixer'); //自动补全浏览器兼容后缀
var cached = require('gulp-cached'); // 搭配 gulp-remember 可增量编译
var remember = require('gulp-remember'); //搭配 gulp-cached 可增量编译
var plumber = require('gulp-plumber'); //校正报错
var replace = require('gulp-replace'); //替换
var webpack = require('webpack');
var config = require('./webpack.config.js');
var connect = require('gulp-connect'); //本地服务
var rest = require('connect-rest');
var uglify = require('gulp-uglify');

//开发路径
var src = {
    html: './src/index.html',
    other: './src/vendor/*.js',
    less: './src/style/styles.less',
    file: './src/style/img/**/*',  //静态文件样式
    vendor: './src/vendor'
}

//编译的路径
var dist = {
    root: "./dist/",
    js: './dist/js',
    less: './dist/style',
    file: './dist/style/img',
    vendor: './dist/vendor'
};

//清除dist文件
function clean(done) {
    del.sync(['dist/**/*']);
    done();
}

//webpack编译
function devWebpack(done) {
    webpack(config(), function (err, stats) {
        //  compileLogger(err, stats);

        done();
    });
}



//编译html
function html(done) {
    return gulp.src(src.html)
        .pipe(plumber())
        .pipe(cached('html')) // 只传递更改过的文件
        .pipe(replace(/\~\/(\S.*.(js|css|png|jpg|gif))/g, function (match, p1) {
            return '192.168.26.144:9090/' + p1;
        }))
        .pipe(remember('html')) // 把所有的文件放回 stream
        .pipe(gulp.dest(dist.root));
    done();
}

//开启本地服务
function connectServer(done) {
    connect.server({
        root: dist.root,
        port: 9092,
        livereload: {
            port: 32140
        },
        middleware: function (connect, opt) {
            return [rest.rester({
                context: "/"
            })]
        }
    });
    done();
}

//监听变化
function watch() {
    gulp.watch(src.html, gulp.series(html, reload));
    gulp.watch([
        './src/commpents/**/*.vue',
        './src/view/**/*.vue',
        './src/**/*.js',
        './src/*html',
        './src/commpents/editor/**/*',
        './src/common/**/*',
        './src/validator/**/*'
    ],
    gulp.series(devWebpack, reload));
    gulp.watch(src.less, gulp.parallel(css));
    gulp.watch(src.file, gulp.parallel(file));
    gulp.watch(src.other, gulp.parallel(vendor));
  
}



 function css(done) {
    gulp.src(src.less) //该任务针对的文件
        .pipe(less())  //编less为css
        .pipe(autoprefixer())//补全浏览器前缀
        // .pipe(minify()) //该任务调用的模块压缩css  
        .pipe(gulp.dest(dist.less))
        .pipe(connect.reload());
    done();
};

function file(done) {
    gulp.src(src.file) //该任务针对的文件
        .pipe(gulp.dest(dist.file))
        .pipe(connect.reload());
    done();
};
function vendor(done) {
    gulp.src(src.other) //该任务针对的文件
        .pipe(uglify()) //压缩js
        .pipe(gulp.dest('./dist/js'))
        .pipe(connect.reload());
    done();
};

function reload() {
    return gulp.src('dist/')
        .pipe(connect.reload()); //自动刷新
        
}



gulp.task("default", gulp.series(clean, devWebpack, html, css, file,vendor, connectServer, watch));




六、建立开发目录

1、在项目根目录中新建src文件夹,并新建index.js文件作为入口文件

import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './router';
import App from './app.vue';



Vue.use(VueRouter);
const router = new VueRouter({
    // mode: 'history',
    routes
})
  


new Vue({
    el: '#app',
    router: router,
    render: h => h(App)
})

2、新建router.js路由文件

export default [
    {
        name: 'home',        
        path: '',
        component: function (resolve) {
            require(['./view/home/index.vue'], resolve)
        }

    },
    {
        name:'case',
        path: '/case',
        component: function (resolve) {
            require(['./view/case/index.vue'], resolve)
        }
    },
    {
        name:'news',
        path: '/news',
        component: function (resolve) {
            require(['./view/news/index.vue'], resolve)
        },
    }
   
];


后续的文件建我就不在这里再写了,源代码里写得还是很清楚的
源文件都在:https://pan.baidu.com/s/1miMJuYW
项目启动:

gulp

大家有什么建议可以发邮箱到我的E-mail,
我的QQ:1830305999
也可以加入我们的Q
我的主页:www.itvwork.com网站还没建好,正在建设中

下一篇:全栈开发二(vue路由的使用)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,424评论 1 32
  • 简介和目录 第三回 阿希入门大行祭礼 圣姑出道小试牛刀 上回说到,“微妙法王”任哲在光明顶安顿下来,一心编撰经...
    易简之阅读 363评论 8 8
  • 插入排序 运行 输出
    Andy周阅读 133评论 0 0
  • 为了明天早上能够多睡一会,张维之特意熬夜把席位卡都放到了会议室。放的时候特意有来来回回的看了很多遍,确保位置正确。...
    张维之阅读 183评论 0 0
  • 为了他 眼神里的 要 于是燃烧 焚身后 被责难气味 是刺鼻的焦 她从一棵树 蔫成了奄奄一息的 草木灰 一明一暗 是...
    段童阅读 53评论 0 0