美文网首页node+vue+mongodb全栈开发前端Vue专辑让前端飞
全栈开发一(webpack+gulp构建vue前端开发环境)

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

作者: itvwork | 来源:发表于2017-09-25 16:50 被阅读382次

    最近把学习了一把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路由的使用)

    相关文章

      网友评论

        本文标题:全栈开发一(webpack+gulp构建vue前端开发环境)

        本文链接:https://www.haomeiwen.com/subject/yotdextx.html