热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用cooking搭建一个多页面易配置的Vue2项目(进阶篇)

通过上一篇文章的介绍,相信大家已经能用cooking配置一个较为完整的Vue项目。今天将通过配置一个多页面的例子为大家介绍cooking的命令行工具——cooking-cli,同样

通过 上一篇文章 的介绍,相信大家已经能用 cooking 配置一个较为完整的 Vue 项目。今天将通过配置一个多页面的例子为大家介绍 cooking 的命令行工具 —— cooking-cli,同样所需要的开发环境依旧是 Node 4+, npm 3+,同时我是在 macOS 下操作的。

搭建基础项目

现在我们需要在上一篇文章配置的项目的基础上,将它改造成支持多页面的项目,其实我们可以直接通过 cooking 的命令行工具直接生成一个 Vue 项目。首先需要全局安装 cooking-cli

npm i cooking-cli -g --registry=https://registry.npm.taobao.org

先检查下是不是使用的 npm 3+,如果不是先升级 npm 再安装。完成后可以到你的项目目录下执行下面指令创建一个目录名 multiple-pages 的 Vue 项目,第一次执行需要安装脚手架的依赖。

cooking create multiple-pages vue

如果没有访问较慢的话可以先配置下 npm 镜像,然后再创建项目。

cooking config registry https://registry.npm.taobao.org

接下来会让你选择一些选项,我们这次选择 Vue2 + bublé + 全局 cooking 的配置。

[20:01:54] Starting 'cooking-vue:default'...
[?] Give your app a name: multiple-pages
[?] Give your app a description: A vue project.
[?] Private? Yes
[?] What Vue version do you what? Vue 2
[?] What ES2015+ compiler do you what to use? bublé (only use wepback 2)
[?] What way use cooking do you want? Global cooking (webpack 2)
[?] Need dev server? Yes
[?] What CSS preprocessor do you want to use? Only CSS
[?] Setup unit tests with Karma + Mocha? No
[?] git repository:
[?] author:
[?] license: ISC
[?] Continue? Yes

最后可以试试直接运行 npm run dev 看看能不能正常启动。使用全局 cooking 的好处是可以减少项目的依赖,

多页面项目分析

如果用 webpack 做 SPA 项目,通常是一个入口文件,第三方库单独打包,或者一些文件可以抽离出去通过 CDN 加载。如果换成多页面,就需要多个入口文件,同时每个页面用到的第三方库也不相同,CDN 的配置也可能不一样。那么为了方便管理,我们可以将它们写在一个配置文件里。

webpack 虽然支持配置多个 chunk,但是哪些页面引入了哪些 common chunk 都需要手动维护,而且对于新手很容易犯错。所以我打算依旧只配置一个 vendor,同时将第三方库尽可能通过 CDN 的方式加载。这样手动维护 CDN 列表比维护 chunk 清晰且容易许多。

这里的 chunk 配置我使用 cooking 默认的,它会将 node_modules 内引用到的依赖都打包到 vendor 内,同时还有一个 manifest 用来保存 webpack 的 runtime,参考 vue webapck 模板。

设计配置文件

写一个名叫 app.json 的配置文件,每个入口共享公共的 CDN 也可以配置私有的 CDN,还可以配置其他基本信息。

{
"pages": [
{
"entry": "home",
"title": "首页",
"cdn": {}
},
{
"entry": "admin",
"title": "后台",
"cdn": {}
}
],
"basePath": "./src/pages/",
"cdn": {
"js": [
"//cdn.jsdelivr.net/vue/2.0.0-rc.7/vue.min.js",
"//cdn.jsdelivr.net/vuex/2.0.0-rc.5/vuex.min.js"
],
"css": []
},
"externals": {
"vue": "Vue",
"vuex": "Vuex"
}
}

同时我们在 src/pages 目录下创建 homeadmin 目录。每个目录下创建一个 index.jsapp.vue 文件。

index.js

import Vue from 'vue'
import App from './app'
new Vue({ // eslint-disable-line
el: '#app',
render: h => h(App)
})

app.vue


配置 cooking

入口文件

接下来我们在生成的 cooking 配置文件上加工下,这里我们要传入多入口的配置,从 app.json 里读取 entry 的信息,通过 basePath 拼接成文件路径。

var App = require('./app.json')
var path = require('path')
var entries = function() {
var result = {}
App.pages.forEach(p => {
result[p.entry] = path.resolve(App.basePath, p.entry)
})
return result
}
cooking.set({
entry: entries()
})

模板文件

所有入口的页面我们都是通过 index.tpl 模板配置,只需要将公用 CDN 和私有 CDN 合并后拼接成 HTML 插入到模板内,同时引入入口文件和 vendor,通过 html-webpack-plugin 的配置选项,可以很方便的实现我们的需求。

var App = require('./app.json')
var path = require('path')
var merge = function(a, b) {
return {
css: (a.css || []).concat(b.css || []),
js: (a.js || []).concat(b.js || [])
}
}
var templates = function() {
return App.pages.map(p => {
return {
title: p.title,
filename: p.entry + '.html',
template: path.resolve(__dirname, 'index.tpl'),
cdn: merge(App.cdn, p.cdn),
chunks: ['vendor', 'manifest', p.entry]
}
})
}
cooking.set({
template: templates()
})

模板文件也要改造一下,支持生成我们指定的 CDN 的 HTML 以及其他配置项。具体语法参考插件文档。






<% for (var i in htmlWebpackPlugin.options.cdn.css) { %>
"><% } %>



<% for (var i in htmlWebpackPlugin.options.cdn.js) { %>
<% } %>

最终配置

最后我们可以优化一下配置,将生成配置的函数提取到另一个文件内,让配置信息更清晰。那么最终的配置内容如下。

var path = require('path')
var cooking = require('cooking')
var build = require('./build')
cooking.set({
entry: build.entries(),
dist: './dist',
template: build.templates(),
devServer: {
port: 8081,
publicPath: '/',
},
clean: true,
hash: true,
sourceMap: true,
chunk: true,
publicPath: '/dist/',
extractCSS: true,
alias: {
'src': path.join(__dirname, 'src')
},
extends: ['vue2', 'buble', 'lint', 'autoprefixer'],
externals: build.externals()
})
module.exports = cooking.resolve()

运行项目

我们直接通过 cooking 命令行启动项目。

cooking watch -p

访问 http://localhost:8081/home.html 或者 http://localhost:8081/admin.html 看效果。

《用 cooking 搭建一个多页面易配置的 Vue 2 项目(进阶篇)》

最后我们通过 build 构建项目。

cooking build -p

总结

我会把上面的配置做成脚手架,可以直接通过 cooking init pages-vue 创建项目,当然只是做了最基础的版本,还可以扩展许多内容:

  • 比如配置某些页面可以忽略全局的 CDN 文件

  • 如果熟悉 chunk,那么把 chunk 也抽离到配置文件里

  • 给入口文件加开关,不一定每次启动都打包所有入口文件

  • 开发模式不使用 CDN,只有生产环境下才使用

如果感兴趣的话欢迎来一起维护,加入更多新功能。

这里只是介绍了 cooking 的命令行工具最基础的用法,还有许多实用的指令以及技巧还没介绍,所以下一篇见。


推荐阅读
  • 微信民众号商城/小顺序商城开源项目介绍及使用教程
    本文介绍了一个基于WeiPHP5.0开发的微信民众号商城/小顺序商城的开源项目,包括前端和后端的目录结构,以及所使用的技术栈。同时提供了项目的运行和打包方法,并分享了一些调试和开发经验。最后还附上了在线预览和GitHub商城源码的链接,以及加入前端交流QQ群的方式。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • RN即ReactNative基于React框架针对移动端的跨平台框架,在学习RN前建议最好熟悉下html,css,js,当然如果比较急,那就直接上手吧,毕竟用学习前面基础的时间,R ... [详细]
  • 1.移除consol.log()的babel插件安装:npmibabel-plugin-transform-remove-console-D配置:babel.config.js:这 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 安卓及谷歌官网不容易上,在此整理好下载地址,这样就可以直接用迅雷下载了。Eclipse最新Mars版Eclipse(暂时还没被墙)Mac版:http:www.eclipse.org ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
  • ReactJSUIAnt设计空组件原文:https://w ... [详细]
author-avatar
mobiledu2502889217
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有