出处:http://www.qingpingshan.com/jb/javascript/221105.html

基于vue2.0生成项目,一段时间都在找如何配置成多个页面的。网上有这样的例子相对也是比较详细的,但是还是有些许不一样的地方的。所以,我还是记录下来,当然我也是参考了网上的资料的。

当然先来个vue的项目,打开命令行工具,对边进入一个目录下。

vue init webpack my-project

注意,node和npm的版本,npm版本最好是3.0+的。其中my-project是自定义的项目名,按照步骤一步一步来就好了,然后进入自动生成的文件夹下,下载依赖的包,然后运行,应该会打开浏览器的localhost:8080。

npm install
npm run dev

如果不出意外是能够打开页面的。

然后你就可以在项目的基础上开心的写组件了,那么我们应该怎么修改vue的配置,让我们的项目是多个页面的呢。

第一步

在index.html同级目录下新增一个页面,welcome.html,然后在src目录下,添加Welcome.vue和welcom_main.js。

第二步修改配置,配置项有4个文件:

build//文件夹下
webpack.base.conf.js
webpack.dev.conf.js
webpack.pro.conf.js
config文件夹下
index.js

其中所有的配置,有index的地方,都需要在复制一份。

比如index.js中:

build:{
play:path.resolve(__dirname, '../dist/welcome.html'), //新增的配置
}

webpack.base.conf.js中

entry:{
welcome: './src/welcome_main.js', //新增的配置
}

其他配置文件里的改动都类似。复制粘贴,然后改吧改吧就好了。

配置完后,运行下 npm run dev

不过这种方式的多页面配置,每次新加一个页面,必须重新配置一次,比较麻烦,如果页面不多,倒也是可行的,但是如果随着项目越来越多,到时候项目目录就很不简洁了。

所以,还有一种一劳永逸的方式。原理其实一样的,不过是文件的配置让文件自动生成。

项目生成方式还是一样,接下来的配置有点不同。

第一步:安装一个包glob 很重要的包

npm install  glob --save-dev

第二步配置config下面的index.js文件

var path = require('path')
var glob = require('glob') var build = {
env: require('./prod.env'),
//index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
productionSourceMap: true,
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
bundleAnalyzerReport: process.env.npm_config_report
} //根据getEntry获取所有入口主页面
var pages = getEntry('src/pages/**/*.html'); //每个入口页面生成一个入口添加到build中
for (var pathname in pages) {
build[pathname] = path.resolve(__dirname, '../dist/' + pathname + '.html')
} module.exports = {
build: build,//生成的配置build
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: false,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
cssSourceMap: false
}
} //获取所有入口文件
function getEntry(globPath) {
var entries = {},
basename; glob.sync(globPath).forEach(function(entry) { basename = path.basename(entry, path.extname(entry));
entries[basename] = entry;
});
return entries;
}

这样就配置完了index.js了。

然后是配置webpack.base.conf.js

var path = require('path')
var glob = require('glob')
var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
var entries = getEntry('./src/pages/**/*.js') function resolve(dir) {
return path.join(__dirname, '..', dir)
} module.exports = {
entry: entries,
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
modules: [
resolve('src'),
resolve('node_modules')
],
alias: {
'vue$': 'vue/dist/vue.common.js',
'src': resolve('src'),
'assets': resolve('src/assets'),
'components': resolve('src/components')
}
},
module: {
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
}, {
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
}, {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}, {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}]
}
} //获取入口js文件
function getEntry(globPath) {
var entries = {},
basename, tmp, pathname; glob.sync(globPath).forEach(function(entry) {
basename = path.basename(entry, path.extname(entry));
pathname = basename.split("_")[0];
entries[pathname] = entry;
});
return entries;
}

这个文件主要是配置entry: entries入口js。具体就不多说了,剩下的两个配置文件类似。我直接复制代码了。

webpack.dev.conf.js文件的配置

var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
var glob = require('glob')
var path = require('path') Object.keys(baseWebpackConfig.entry).forEach(function(name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
}) module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
new FriendlyErrorsPlugin(),
]
}) function getEntry(globPath) {
var entries = {},
basename; glob.sync(globPath).forEach(function(entry) { basename = path.basename(entry, path.extname(entry));
entries[basename] = entry;
});
return entries;
} var pages = getEntry('src/pages/**/*.html'); for (var pathname in pages) {
// 配置生成的html文件,定义路径等
var conf = {
filename: pathname + '.html',
template: pages[pathname], // 模板路径
inject: true, // js插入位置
chunks: [pathname]
};
module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

webpack.prod.conf.js文件的配置

var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = config.build.env var plugins = [
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new webpack.optimize.OccurrenceOrderPlugin(),
new ExtractTextPlugin(utils.assetsPath('css/[name].[contenthash].css')),
] function getEntry(globPath) {
var entries = {},
basename; glob.sync(globPath).forEach(function(entry) { basename = path.basename(entry, path.extname(entry));
entries[basename] = entry;
});
return entries;
} var pages = getEntry('src/pages/**/*.html'); for (var pathname in pages) {
var conf = {
filename: process.env.NODE_ENV === 'testing' ? pathname + '.html' : config.build[pathname],
template: pages[pathname],
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
},
chunks: [pathname]
}
plugins.push(new HtmlWebpackPlugin(conf));
} var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: plugins
}) if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin') webpackConfig.plugins.push(newCompressionWebpackPlugin({asset:'[path].gz[query]',algorithm:'gzip',test:newRegExp('\\.('+
config.build.productionGzipExtensions.join('|')+')$'),threshold:10240,minRatio:0.8}))}if(config.build.bundleAnalyzerReport){varBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(newBundleAnalyzerPlugin())}module.exports = webpackConfig

好了,所有配置文件写完。

还有最后一步就是修改项目目录结构。

在src目录下新建一个page目录,然后建一个index目录用来放index.html、Index.vue、index_main.js三个文件。

如果有多个页面,就类似添加一个video目录存放三个文件,每个文件的书写方式。按照index文件书写方式一样。

index.html文件

<!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<link rel="shortcut icon" href="http://cdn.bunny-tech.com/promotion/static/act-imags/icon.png" />
<title>映兔视频</title>
</head> <body>
<div id="app"></div>
</body> </html>

Index.vue文件

<template>
<div class="warp">
<p>index</p>
<hello></hello>
</div>
</template>
<script>
import main from '../../lib/main'
import Hello from '../../components/Hello'
import store from '../../lib/store' export default {
name: 'index',
components: {
'hello': Hello
},
data() {
return {
bannerHref: '', }
},
mounted() {
this.loadData();
},
methods: {
loadData() {
var rep = {
bannerPosition: 'hasActive'
}
store.getinfo(rep,
function(res) {
if (res.errorCode == 0) {
console.log(res.data);
}
})
}
}
}
</script>
<style scoped>
.warp {
max-width: 750px;
margin: 0 auto;
background: #CCC;
}
</style>

index_main.js文件

import Vue from 'vue'
import App from './Index'
import Resource from 'vue-resource' Vue.use(Resource); new Vue({
el: '#app',
template: '<App/>',
components: { App }
})

ok了,记得删除主目录下的index.html文件哦,因为那个已经被我们移到page目录下面了。以后就安心写业务代码吧。不需要管配置的问题了。上面文件里关于vue-resource的代码,在写demo的时候都可以去掉,那是关于vue异步请求数据的,这个例子用不到。如果喜欢下次写一点关于vue异步请求数注意事项。

vue项目中多个入口的配置的更多相关文章

  1. vue项目中postcss-pxtorem的使用及webpack中的配置 css中单位px和em,rem的区别

    移动手机版要求我们在制作嵌入h5的时候去适配不同的手机.适配有多重模式,有flex.百分比等.字体大小的控制也有px.百分比.rem等单位,webpack中 px转rem. vue项目中postcss ...

  2. 在vue项目中的axios使用配置记录

    默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...

  3. 前端学习笔记系列一:10整体移动vscode代码块、VSCode 使用 stylus,配置格式化设置、在vue项目中引入bootstrap

    1.整体移动vscode代码块 凭借操作的经验我们能够轻松地知道将代码整体往右移只需选中代码按Tab键即可.其实往左移也很简单: 选中之后按下 shift+Tab键 即可. 2.VSCode 使用 s ...

  4. vue 项目中实用的小技巧

    # 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...

  5. Vue项目中遇到的一些问题总结

    一.开发环境使用Ajax请求,报错  网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...

  6. 如何在Vue项目中,通过点击DOM自动定位VScode中的代码行?

    作者:vivo 互联网大前端团队- Youchen 一.背景 现在大型的 Vue项目基本上都是多人协作开发,并且随着版本的迭代,Vue 项目中的组件数也会越来越多,如果此时让你负责不熟悉的页面功能开发 ...

  7. 如何在VUE项目中添加ESLint

    如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...

  8. vue项目中关于axios的简单使用

    axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 官方仓库:https://github.com/axios/axios 中文文档:htt ...

  9. 浅谈 Axios 在 Vue 项目中的使用

    介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 特性 它主要有如下特性: 浏览器端发起XMLHttpRequests请求 Node端发起http ...

随机推荐

  1. 【noip模拟题】日历游戏(博弈论+搜索)

    直接搜索即可... 注意不要爆栈..所以我们可以分块搜索... 然后太懒且太弱我就不写了... orz hzwer http://hzwer.com/4954.html [问题描述] moreD和mo ...

  2. php的form中元素name属性相同时的取值问题

    php的form中元素name属性相同时的取值问题:修改元素的名称,在名称后面加上 '[]',然后取值时即可得array()数组. 一.以复选框为例: <html> <head> ...

  3. windows 10 搭建go环境

    1. 到 https://golang.org/ 下载go 的msi安装包.安装后 GOROOT 已经自动帮你设置好. 2.设置GOPATH 不能跟 GOROOT 同一个目录.到系统环境变量里新增一个 ...

  4. 转载 -- Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`

    [cocopad集成百川sdk官网] iOS需要填写BundleID .BundleID要是当前应用的BundleID.勾选淘宝登录基础包下载SDK. 注意事项:将下载的SDK中的身份图片yw_122 ...

  5. Proxool线程池的简单实现demo

    使用的jar包:ojdbc14.jar    proxool-0.9.0.jar   commons-logging-1.1.3.jar 代码分为两部分: ProxoolTest.java和proxo ...

  6. C语言switch语句

    C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英 ...

  7. 分布式项目中 linux 服务器 部署jar 应用脚本 deploy.sh

    在实际项目的部署中,尤其是分布式项目,有很多服务的jar包需要 部署,这里抽取出公用的 deploy的脚本 下面是不含jdk配置的 #!/bin/bash JAVA_OPTIONS_INITIAL=- ...

  8. c#基础 第五讲

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. 【BZOJ4002】[JLOI2015]有意义的字符串 数学

    [BZOJ4002][JLOI2015]有意义的字符串 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行三个整数 ...

  10. 【BZOJ4318】OSU! 期望DP

    [BZOJ4318]OSU! Description osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1 ...