基于vue-cli搭建一个多页面应用(三)--路径、模块别名和模块自动加载配置
tonyfree opened this issue · 6 comments
路径、模块别名的设置
在build/webpack.base.conf.js中可以看到如下的配置:
......
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
}
}
......
这涉及到webpack的resolve的配置,可查看官方相关API,其中extensions是设置自动解析扩展程序,alias是设置路径或模块的别名
在pages/index/router/index.js中有相应的使用:
import Hello from '@/components/Hello'
同理我们可进一步设置一些路径的别名:
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'components': '@/components',
'pages': '@/pages',
'js': '@/modules/js',
'css': '@/modules/css',
'sass': '@/modules/sass',
'imgs': '@/modules/imgs'
}
在pages/index/router/index.js中对Hello.vue的引用就可以简写为:
import Hello from 'components/Hello'
模块自动化配置
在pages/index/router/index.js中,对vue和vue-router的使用都需要先加载
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
可不可以自动化加载,不需要每次都手动引用呢?webpack自带的ProvidePlugin插件配置解决了这个问题。
在build/webpack.base.conf.js中添加如下配置:
var webpack = require('webpack')
module.exports = {
entry: utils.entries(),
output: {...},
plugins: [
new webpack.ProvidePlugin({
Vue: 'vue',
Resource: 'vue-resource',
Router: 'vue-router',
Vuex: 'vuex'
})
],
resolve: {...}
......
}
这样模块在使用时会自动加载,在pages/index/router/index.js中,可以把对vue和vue-router的引入省略掉:
//import Vue from 'vue'
//import Router from 'vue-router'
Vue.use(Router)
但是要注意:在上面设置模块别名的时候,已经设置了vue的别名,为什么模板自动设置了别名呢?还记得我们在基础结构的搭建中Vue build这个步的选择Runtime + Compiler吗?vue的NPM包默认导出的是运行时构建,所以在设置了这个别名,可见vue官方文档对独立构建vs运行时构建的说明
默认vue模块的配置,使用了ES2015的模块化脚本,但是webpack本质上是基于node的一个工具而已,目前node还不支持ES2015的原生模块化
'vue$': 'vue/dist/vue.esm.js'
我们来对比一下vue.common.js和vue.esm.js,会发现两处差异:一个是严格模式,另一个就是模块化:
所以,如果我们不做模块自动化加载,vue模块的别名可以使用vue.esm.js,在使用中ES2015会被babel转译,但是如果使用webpack.ProvidePlugin做模块自动化加载,需要把别名修改为:
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.common.js',
'@': resolve('src'),
}
}
最后,关于node对ES2015的支持情况,可查看node.green,其中不包含对import/export模块的支持
最后的最后,曾尝试用ES2015的语法写webpack配置文件,但是并没有找好较好的实践方案,如果你有好的实践方案请推荐一下,谢谢!
本系列文章:
模块自动化配置失败 提示Router不是一个构造函数
Router: ['vue-router/dist/vue-router.esm.js', 'default'], 经测试 这么写就对了 参考webpack插件文档的写法
也可以写成Router: 'vue-router/dist/vue-router.common.js' 建议第二种写法 第一种应该是webpack自己对ES6模块进行了解析
您好,请教个问题。Vue多页应用在SEO方面,是不是比单页应用更友好?
我的想法是,合理设置html的title,description,keywords是前端SEO的一部分。SPA由于只有一个html入口,所以各个页面的这3个都是一样的。多页应用由于有多个html入口,可以分别设置各个html的title,description,keywords。我这个想法是错误的吗?希望能解答下
我是感觉影响seo最大的因素在于爬虫爬到的页面是动态生成的 所以无论title和关键词是啥 拿到的都是空的 所以影响小 从而这一块是ssr的切入点