微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vue-cli创建项目从单页面到多页面的方法

对于某些项目来说,单页面不能很好的满足需求,所以需要将vue-cli创建的单页面项目改为多页面项目。

需要修改以下几个文件

1、下载依赖glob

rush:js;"> $npm install glob --save-dev

2、修改build下的文件

(1)修改webpack.base.conf.js

添加以下代码

rush:js;"> var glob = require('glob'); var entries = getEntry('./src/pages/**/*.js')

将module.exports中的

rush:js;"> entry: { app: './src/main.js' },

注释掉,然后添加这一行代码

rush:plain;"> entry: entries,

至于entries是什么,别急呀,看下面:

添加一个方法

rush:js;"> //获取入口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]; //index_main.js得到index
entries[pathname] = entry;
});
return entries;
}

这个文件修改成这样子就可以了。

(2)修改webpack.dev.conf.js

添加以下代码

rush:js;"> //引入 var glob = require('glob') var path = require('path')

将module.exports中的plugins里的

rush:js;"> new HtmlWebpackPlugin({ filename: 'index.html',template: 'index.html',inject: true }),

注释掉,然后添加以下代码

rush:js;"> 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));
}

这个文件修改到此就可以了。

(3)webpack.prod.conf.js

这个文件修改的套路与上一个文件类似 添加以下代码: var glob = require('glob') 因为项目在创建时,生成项目的时候是直接将可选的所有依赖都选择了yes,所以项目中的env的声明定义如下:

代码如下:
fig/test.env') : config.build.env ;

但是由于webpack.test.conf.js文件目前还没有进行修改,所以需要把这行声明换成下面这行:

rush:js;"> var env = config.build.env

将webpackConfig中的plugins里的

rush:js;"> new HtmlWebpackPlugin({ filename: config.build.index,inject: true,minify: { removeComments: true,collapseWhitespace: true,removeAttributeQuotes: true },chunksSortMode: 'dependency' }),

注释掉,在声明定义webpackConfig的后面添加以下代码

rush:js;"> 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],minify: {
removeComments: true,removeAttributeQuotes: true
},chunks:[pathname]
}
webpackConfig.plugins.push(new HtmlWebpackPlugin(conf));
}

此时,这个文件修改好了。

3、修改config下的文件

这个文件夹下,只需要修改一个文件:index.js 这个文件的作用是,寻找文件路径,然后根据这个文件设置的目录层级,生成打包后的文件以及相应的层级文件结构。 添加以下代码

rush:js;"> var build = { env: require('./prod.env'),assetsRoot: path.resolve(__dirname,'../dist'),assetssubdirectory: 'static',assetsPublicPath: '/',productionSourceMap: true,productionGzip: false,productionGzipExtensions: ['js','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');

//入口 index: path.resolve(__dirname,'../dist/index.html')
for (var pathname in pages) {
build[pathname] = path.resolve(__dirname,'../dist/' + pathname + '.html')
}

然后将module.exports中的build的值换成我们刚刚添加声明的变量build。 如果希望修改打包后的目层级结构,可以在build中修改;还可以在build中增加我们需要定义的变量,比如我们需要将fabfile.py和favicon.ico拷贝到dist目录下的a目录下,就可以在build中定义一个属性

rush:js;"> distA:path.resolve(__dirname,'../dist/a),

然后因为在webpack.prod.conf.js中已经引入了'copy-webpack-plugin'(var copyWebpackPlugin = require('copy-webpack-plugin')),我们就可以在 webpackConfig.plugins下添加如下代码

rush:js;"> new copyWebpackPlugin([ { from: path.resolve(__dirname,'../fabfile.py'),to: config.build.distA,template: 'fabfile.py' } ]) new copyWebpackPlugin([ { from: path.resolve(__dirname,'../favicon.ico'),template: 'favicon.ico' } ])

在src目录下添加pages文件

目录的层级结构安排成类似于这种形式:

5、打包

做完以上修改,虽然本地运行没有问题,但是打包后,还是会有问题,会出现报错:webpackJsonp is not defined 解决方式如下: 在webpack.prod.conf.js文件下的for (var pathname in pages)循环中定义的conf里,添加两行代码

rush:plain;"> chunksSortMode: 'dependency',// dependency 页面中引入的js按照依赖关系排序;manual 页面中引入的js按照下面的chunks的数组中的顺序排序;

chunks: ['manifest','vender',pathname] // 生成页面中引入的js,'manifest','vender'这两个js是webpack在打包过程中抽取出的一些公共方法依赖,其中,'manifest'又是从'vender'中抽取得到的,所以这三个js文件的依赖关系是 pathname依赖 'vender','vender'依赖'manifest'.

综上,就是本次项目从单页面到多页面项目的转变历程,关于webpack.test.conf.js文件修改,后续修改成功后,会继续补充添加

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


可以通过min-width属性来设置el-table-column的最小宽度。以下是一个示例: <template> <el-table :data="tableData"> <el-table-column prop="item_no&q
yarn dev,当文件变动后,会自动重启。 yanr start不会自动重启 nodemon会监听文件变动,跟yarn dev和yarn start无关。
ref 用于创建一个对值的响应式引用。这个值可以是原始值(如数字或字符串)或对象。当 ref 的值发生变化时,Vue 会自动更新 DOM 或任何其他使用该 ref 的响应式依赖。 使用示例: import { ref } from 'vue'; const count = ref(0
通过修改 getWK005 函数来实现这一点。这里的 query 参数就是发送 GET 请求时的查询参数。你可以将需要的条件作为 query 对象的属性传递进去。比如,如果你想要按照特定的条件查询信息,你可以在调用 getWK005 函数时传递这些条件。例如: getWK005({ conditio
<el-form-item label="入库类型" prop="mt_type"> <el-select v-model="form.mt_type" filterable placeholder="请选择&q
API 变动 样式类名变化: 一些组件的样式类名有所变动,可能需要更新你的自定义样式。 事件名和属性名变化: 某些组件的事件名和属性名发生了变化,需要检查 Element Plus 文档 以了解详细信息。 使用 setup 函数: 在 Vue 3 中,可以使用 Composition API(如 s
安装和引入方式 Element UI (Vue 2): // main.js import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-cha
排查400 (Bad Request)和解决这个问题,可以按照以下步骤进行: 检查URL和端点:确保URL http://127.0.0.1:8008/basicApp/BS037HModel/ 是正确的,并且该端点在服务器上存在。 检查请求参数:确认发送请求时的任何参数都是正确的,包括查询参数、请
在 Vue.js 中,<template> 标签是一种特殊的标签,它用于定义组件的模板,但不会直接渲染为 HTML 元素。它的主要用途是在编写组件和使用插槽时提供灵活的模板定义。以下是关于 <template> 标签的一些关键概念和使用示例。 基本用法 组件模板:在单文件组件
el-config-provider是Element Plus库中的一个组件,用于提供全局的配置。它是Element Plus在2.0版本中引入的新组件。 el-config-provider组件的作用是允许你在应用程序中统一配置Element Plus的一些全局属性和样式,这些配置将被应用于所有E