全棧開發(fā)一(webpack+gulp構(gòu)建vue前端開發(fā)環(huán)境)

最近把學(xué)習(xí)了一把vue這個(gè)前端框架,現(xiàn)在來寫一關(guān)于開發(fā)vue項(xiàng)目的教程。我們會(huì)用mongdb+node作后臺(tái)鳍怨,vue作前端,構(gòu)建一個(gè)簡(jiǎn)單企業(yè)型的一個(gè)網(wǎng)站跪妥。

構(gòu)建vue前端開發(fā)環(huán)境

一鞋喇、安裝node.js;

進(jìn)入http://nodejs.cn/選擇自己系統(tǒng)所對(duì)應(yīng)的node版本下載,個(gè)人推薦最新的8.4版本眉撵。

二侦香、安裝淘寶鏡像

打開終端,window運(yùn)行cmd 輸入

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

為什么安裝這個(gè)呢纽疟?很多人都說用npm就行了罐韩,其實(shí)主要是我們國家的網(wǎng)絡(luò)問題,很多外國的網(wǎng)站都會(huì)被墻掉污朽,不翻墻訪問不到散吵,所以我們安裝這個(gè)鏡像是方便我們下載依賴包;

三、建立項(xiàng)目

在你在系統(tǒng)中建立一個(gè)文件夾蟆肆,用來存放你的源代碼我的是window系統(tǒng)矾睦,我在 e盤中建立了一個(gè)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: 全棧開發(fā)項(xiàng)目
entry point: (index.js)
test command: 介紹信息
git repository:
keywords:
author: 藍(lán)訣
license: (ISC)
About to write to E:\node\vueteam\package.json:

{
  "name": "vueteam",
  "version": "1.0.1",
  "description": "全棧開發(fā)項(xiàng)目",
  "main": "index.js",
  "scripts": {
    "test": "介紹信息"
  },
  "author": "藍(lán)訣",
  "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": "全棧開發(fā)項(xiàng)目",
  "main": "index.js",
  "scripts": {
    "test": "介紹信息"
  },
  "author": "藍(lán)訣",
  "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

在根目錄建立一個(gè)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'  第三方j(luò)s 也就是獨(dú)立出來的包,比如jquery, echart
        },
        output: {
            filename: '[name].js', //編譯的文件名
            publicPath: '/js/',//抽出的靜態(tài)文件出來蛇损,可不用管官紫,我打算用gulp處理靜態(tài)文件
            path: path.resolve(__dirname, 'dist/js'),//編譯代碼后的路徑
        },
        module: {
            //編譯的規(guī)則
            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是一個(gè)es譯版本,目前最新是stage-3
                }
            },
            {
                test: /\.less$/,    //編譯vue里的less樣式
                loader: 'less-loader'
            },
            {
                test: /\.(png|jpg|gif)$/,  //編譯樣式里的靜態(tài)文件
            loader: 'url-loader',
                query: {
                // 把較小的圖片轉(zhuǎn)換成base64的字符串內(nèi)嵌在生成的js文件里
                limit: 10000,
                // 路徑要與當(dāng)前配置文件下的publicPath相結(jié)合
                name: '../style/[name].[ext]?[hash:7]'
            }
                },
                {
        test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/, //css文字
            loader: 'file-loader',
                query: {
            // 把較小的圖標(biāo)轉(zhuǎn)換成base64的字符串內(nèi)嵌在生成的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'); //自動(dòng)補(bǔ)全瀏覽器兼容后綴
var cached = require('gulp-cached'); // 搭配 gulp-remember 可增量編譯
var remember = require('gulp-remember'); //搭配 gulp-cached 可增量編譯
var plumber = require('gulp-plumber'); //校正報(bào)錯(cuò)
var replace = require('gulp-replace'); //替換
var webpack = require('webpack');
var config = require('./webpack.config.js');
var connect = require('gulp-connect'); //本地服務(wù)
var rest = require('connect-rest');
var uglify = require('gulp-uglify');

//開發(fā)路徑
var src = {
    html: './src/index.html',
    other: './src/vendor/*.js',
    less: './src/style/styles.less',
    file: './src/style/img/**/*',  //靜態(tài)文件樣式
    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();
}

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

//監(jiān)聽變化
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) //該任務(wù)針對(duì)的文件
        .pipe(less())  //編less為css
        .pipe(autoprefixer())//補(bǔ)全瀏覽器前綴
        // .pipe(minify()) //該任務(wù)調(diào)用的模塊壓縮css  
        .pipe(gulp.dest(dist.less))
        .pipe(connect.reload());
    done();
};

function file(done) {
    gulp.src(src.file) //該任務(wù)針對(duì)的文件
        .pipe(gulp.dest(dist.file))
        .pipe(connect.reload());
    done();
};
function vendor(done) {
    gulp.src(src.other) //該任務(wù)針對(duì)的文件
        .pipe(uglify()) //壓縮js
        .pipe(gulp.dest('./dist/js'))
        .pipe(connect.reload());
    done();
};

function reload() {
    return gulp.src('dist/')
        .pipe(connect.reload()); //自動(dòng)刷新
        
}



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




六、建立開發(fā)目錄

1毁涉、在項(xiàng)目根目錄中新建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)
        },
    }
   
];


后續(xù)的文件建我就不在這里再寫了贫堰,源代碼里寫得還是很清楚的
源文件都在:https://pan.baidu.com/s/1miMJuYW
項(xiàng)目啟動(dòng):

gulp

大家有什么建議可以發(fā)郵箱到我的E-mail,
我的QQ:1830305999
也可以加入我們的Q
我的主頁:www.itvwork.com網(wǎng)站還沒建好穆壕,正在建設(shè)中

下一篇:全棧開發(fā)二(vue路由的使用)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市其屏,隨后出現(xiàn)的幾起案子喇勋,更是在濱河造成了極大的恐慌,老刑警劉巖偎行,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件川背,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛤袒,警方通過查閱死者的電腦和手機(jī)熄云,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妙真,“玉大人缴允,你說我怎么就攤上這事≌涞拢” “怎么了练般?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锈候。 經(jīng)常有香客問我薄料,道長,這世上最難降的妖魔是什么晴及? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嫡锌,結(jié)果婚禮上虑稼,老公的妹妹穿的比我還像新娘。我一直安慰自己势木,他們只是感情好蛛倦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啦桌,像睡著了一般溯壶。 火紅的嫁衣襯著肌膚如雪及皂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天且改,我揣著相機(jī)與錄音验烧,去河邊找鬼。 笑死又跛,一個(gè)胖子當(dāng)著我的面吹牛碍拆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慨蓝,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼感混,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了礼烈?” 一聲冷哼從身側(cè)響起弧满,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎此熬,沒想到半個(gè)月后庭呜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摹迷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年疟赊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡碉。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡近哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲫寄,到底是詐尸還是另有隱情吉执,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布地来,位于F島的核電站戳玫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏未斑。R本人自食惡果不足惜咕宿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜡秽。 院中可真熱鬧府阀,春花似錦充蓝、人聲如沸蔫骂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞蚌。三九已至田巴,卻和暖如春钠糊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壹哺。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工抄伍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斗躏。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓逝慧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啄糙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笛臣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在現(xiàn)在的前端開發(fā)中,前后端分離隧饼、模塊化開發(fā)沈堡、版本控制、文件合并與壓縮燕雁、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,448評(píng)論 1 32
  • 簡(jiǎn)介和目錄 第三回 阿希入門大行祭禮 圣姑出道小試牛刀 上回說到诞丽,“微妙法王”任哲在光明頂安頓下來,一心編撰經(jīng)...
    易簡(jiǎn)之閱讀 375評(píng)論 8 8
  • 插入排序 運(yùn)行 輸出
    Andy周閱讀 137評(píng)論 0 0
  • 為了明天早上能夠多睡一會(huì)拐格,張維之特意熬夜把席位卡都放到了會(huì)議室僧免。放的時(shí)候特意有來來回回的看了很多遍,確保位置正確捏浊。...
    張維之閱讀 190評(píng)論 0 0
  • 為了他 眼神里的 要 于是燃燒 焚身后 被責(zé)難氣味 是刺鼻的焦 她從一棵樹 蔫成了奄奄一息的 草木灰 一明一暗 是...
    段童閱讀 55評(píng)論 0 0