Vue+thinkJs博客网站(一)之vue多页面应用的webpack3配置

news/2024/4/27 16:33:38/文章来源:https://blog.csdn.net/weixin_34192993/article/details/88612496

一.项目简介

    本项目使用vue作为前端框架,thinkJs作为后端框架,构建个人博客网站,页面分为博客展示和后台管理,主要目的是学习使用thinkJs。现在只完成了主要的博客增删改功能,发现webpack的配置遇到了一些坑,这里先记录下。项目目录结构如下:
图片描述

其中system文件夹是前端vue项目的代码,博客展示页面与后台管理页面都在这里,打包成两个页面,具体webpack配置是本文重点。项目地址在这

二.搭建过程

安装nodejs后,首先安装thinkjs

npm install -g think-cli;
thinkjs new self_blog;
npm install;
npm start;

这样thinkJs项目初步搭建完成了,接下来创建vue项目。项目根目录下新建文件夹system。

npm install -g vue-cli
vue init webpack self_blog
cd self_blog
npm install
npm run dev

这样vue项目初步搭建完毕,接下来讲下这里vue的具体webpack配置。

三.webpack配置

项目前端页面分为博客的展示和后台管理,这里的思路是将sytem的src下面放后台管理页面,在sytem下新建blog文件夹,放前台展示页面,打包时生成两个html,实现webpack打包多页面应用。目录如下:
图片描述

1.webpack.base.conf.js的配置

使用vue-cli创建项目,npm run dev运行开发环境,会使用webpack-dev-server作为前端服务器,从而实现热加载。这样打包的文件只会在内存里,这里我的思路是直接生成到thinkJs项目的view目录下,通过服务端的路由返回给前端。这样只用启动后端的服务就行了,因为文件已经打包到服务端,前端也不存在跨域访问后端的问题了。所以这里就不需要配置devServer了,而是改变html与js等静态资源的生成目录。首先看下webpack.base.conf.js的代码:

"use strict";
const path = require("path");
const utils = require("./utils");
const config = require("../config");
const vueLoaderConfig = require("./vue-loader.conf");
const webpack = require("webpack");
const baseFileName = require("../package.json").name;
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const cleanWebpackPlugin = require("clean-webpack-plugin");
const AssetsPlugin = require("assets-webpack-plugin");
function resolve(dir) {return path.join(__dirname, "..", dir);
}module.exports = {context: path.resolve(__dirname, "../"),entry: {app: "./src/main.js",blog: "./blog/index.js"},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"],alias: {vue$: "vue/dist/vue.esm.js","@": resolve("src")}},externals: {vue: "Vue","vue-router": "VueRouter",echarts: "echarts",ElementUI: "element-ui"},module: {rules: [{test: /\.vue$/,loader: "vue-loader",options: vueLoaderConfig},{test: /\.js$/,loader: "babel-loader",include: [resolve("src"),resolve("test"),resolve("node_modules/webpack-dev-server/client")]},{test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,loader: "url-loader",exclude: [resolve("src/icons")],options: {limit: 10000,name: utils.assetsPath(baseFileName + "https://segmentfault.com/img/[name].[hash:7].[ext]")}},{test: /\.svg$/,loader: "svg-sprite-loader",include: [resolve("src")],options: {symbolId: "icon-[name]"}},{test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,loader: "url-loader",options: {limit: 10000,name: utils.assetsPath(baseFileName + "/media/[name].[hash:7].[ext]")}},{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,loader: "url-loader",options: {limit: 10000,name: utils.assetsPath(baseFileName + "/fonts/[name].[hash:7].[ext]")}}]},plugins: [new AssetsPlugin({filename: "build/webpack.assets.js",processOutput: function(assets) {return "window.WEBPACK_ASSETS=" + JSON.stringify(assets);}}),new webpack.optimize.CommonsChunkPlugin({name: "vendor",minChunks: function(module) {return (module.resource &&/\.js$/.test(module.resource) &&module.resource.indexOf(path.join(__dirname, "../node_modules")) === 0);}}),new webpack.optimize.CommonsChunkPlugin({name: "manifest",minChunks: Infinity}),new ExtractTextPlugin({filename: utils.assetsPath(baseFileName + "/css/[name].[contenthash].css"),allChunks: true}),// 编译前删除之前编译生成的静态资源new cleanWebpackPlugin(["www/static/self_blog", "view/blog"], {root: resolve("../")})],node: {setImmediate: false,dgram: "empty",fs: "empty",net: "empty",tls: "empty",child_process: "empty"}
};

首先需要改的是入口文件,因为是多页面应用,需要多个入口文件来保证打包成不同的chunk。我们知道正常vue-cli创建的但页面应用,会打包成三个chunk,分别是vendor.js(第三方依赖),manifest.js(异步加载的实现),app.js(业务代码)。这里新增一个入口文件,打包时就会生成名为blog.js的chunk,含有前台展示页面的js业务代码。

这里新增使用的clean-webpack-plugin,是为了每次编译后,删除之前生成的js,css等静态资源,否则因为这些资源不重名,就会一直堆在你生成的目录下。

此外一些第三方依赖,vue,elementUI什么的,我使用了cdn引入,这样打包时这些依赖不会打进去,进而减小的vendor.js的体积。具体做法就是配置里的externals定义这些依赖,然后在生成html的模板里用script标签直接引入cdn里的js。

注意一下,如果你开发时想用vue-devtool,需要引入vue.js,如果不用就引入vue.min.js。

2.webpack.dev.conf.js的配置

先看下代码:

"use strict";
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const path = require("path");
const baseWebpackConfig = require("./webpack.base.conf");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin");
const portfinder = require("portfinder");const HOST = process.env.HOST;
const PORT = process.env.PORT && Number(process.env.PORT);
const baseFileName = require("../package.json").name;
function resolve(dir) {return path.join(__dirname, "..", dir);
}
const devWebpackConfig = merge(baseWebpackConfig, {module: {rules: utils.styleLoaders({sourceMap: config.dev.cssSourceMap,extract: true,usePostCSS: true})},// cheap-module-eval-source-map is faster for developmentdevtool: config.dev.devtool,output: {path: resolve(config.dev.assetsRoot),filename: "static/" + baseFileName + "/js/[name]-[hash:5].js",chunkFilename: "static/" + baseFileName + "/js/[name]-[id:5].js"},plugins: [new webpack.DefinePlugin({"process.env": require("../config/dev.env")}),// new webpack.HotModuleReplacementPlugin(),new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.new webpack.NoEmitOnErrorsPlugin(),// https://github.com/ampedandwired/html-webpack-pluginnew HtmlWebpackPlugin({filename: resolve(`../view/blog/index_index.html`),template: "./view/index.html",title: "博客管理系统",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "app"]}),new HtmlWebpackPlugin({filename: resolve(`../view/blog/blog_index.html`),template: "./view/blog.html",title: "博客展示",inject: true,chunks: ["manifest", "vendor", "blog"]}),// copy custom static assetsnew CopyWebpackPlugin([{from: path.resolve(__dirname, "../static"),to: config.dev.assetsSubDirectory,ignore: [".*"]}])]
});
module.exports = devWebpackConfig;

这里我删掉了之前默认配置的devSever,以及module.exports直接导出devWebpackConfig。此外,因为打包生成目录的变化,我修改了output里面的path,filename,chunkFilename。使他们生成到self_blog根目录的www/static下面,这也是thinkJs静态资源的默认目录。需要注意下,filename指的是你的出口文件(app),以及通过codespliting生成的js(vendor,manifest)的文件名;chunkFilename定义的是一些懒加载组件打包后的js文件名。

下面需要添加的就是html-webpack-plugin,因为需要打包成两个html,所以使用两次这个插件。除了定义生成文件名(filename),html模板(template)等,还需要定义你这个html需要的chunk,这是跟单页面配置的一个区别。

除此之外,如果你想要开发环境打包时就分离出css,那么在使用utils.styleLoaders时,将extract置为true。因为这里的方法判断是开发环境才使用extract-text-plugin抽离css。

3.webpack.prod.conf.js的配置

prod的配置与dev差不多,生成文件目录也没变,只不过多了一些js,css压缩插件。

"use strict";
const path = require("path");
const utils = require("./utils");
const webpack = require("webpack");
const config = require("../config");
const merge = require("webpack-merge");
const baseWebpackConfig = require("./webpack.base.conf");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const OptimizeCSSPlugin = require("optimize-css-assets-webpack-plugin");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const baseFileName = require("../package.json").name;
const env = require("../config/prod.env");
function resolve(dir) {return path.join(__dirname, "..", dir);
}
const webpackConfig = merge(baseWebpackConfig, {entry: {app: "./entry/entry-client-index",blog: "./entry/entry-client-blog"},module: {rules: utils.styleLoaders({sourceMap: config.build.productionSourceMap,extract: true,usePostCSS: true})},devtool: config.build.productionSourceMap ? config.build.devtool : false,output: {path: resolve(config.dev.assetsRoot),filename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js",chunkFilename: "static/" + baseFileName + "/js/[name]-[chunkhash:5].js"},plugins: [new webpack.DefinePlugin({"process.env": require("../config/prod.env"),"process.env.VUE_ENV": '"client"'}),new UglifyJsPlugin({uglifyOptions: {compress: {warnings: false}},sourceMap: config.build.productionSourceMap,parallel: true}),new webpack.optimize.OccurrenceOrderPlugin(),new webpack.LoaderOptionsPlugin({minimize: true}),// extract css into its own filenew ExtractTextPlugin({filename: utils.assetsPath(baseFileName + "/css/[name].[contenthash].css"),allChunks: true}),new HtmlWebpackPlugin({minify: {},chunksSortMode: "dependency",environment: process.env.NODE_ENV,filename: resolve(`../view/blog/index_index.html`),template: "./view/index.html",title: "博客管理系统",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "app"]}),new HtmlWebpackPlugin({filename: resolve(`../view/blog/blog_index.html`),template: "./view/blog.html",title: "博客展示",favicon: resolve("favicon.ico"),inject: true,chunks: ["manifest", "vendor", "blog"]}),// Compress extracted CSS. We are using this plugin so that possible// duplicated CSS from different components can be deduped.new OptimizeCSSPlugin({cssProcessorOptions: config.build.productionSourceMap? { safe: true, map: { inline: false } }: { safe: true }}),]
});if (config.build.productionGzip) {const CompressionWebpackPlugin = require("compression-webpack-plugin");webpackConfig.plugins.push(new CompressionWebpackPlugin({asset: "[path].gz[query]",algorithm: "gzip",test: new RegExp("\\.(" + config.build.productionGzipExtensions.join("|") + ")$"),threshold: 10240,minRatio: 0.8}));
}if (config.build.bundleAnalyzerReport) {const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;webpackConfig.plugins.push(new BundleAnalyzerPlugin());
}module.exports = webpackConfig;

四.总结

具体可以看github上的代码

本次项目主要目的是练习thinkJs,这里先把前期webpack配置方面的东西简单说下,下一篇将会仔细讲下thinkJs的使用方法和特性。项目会继续更新,不少东西还没做完呢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_793829.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[摘录]大型网站架构演变和知识体系

架构演变第一步:物理分离webserver和数据库最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候 已经是托管…

大型网站前端使用图片格式的正确姿势

在网页上使用JPG、PNG和SVG:新手指南 | Cheesecake Labs 本文转载自:众成翻译 译者:lunasun 审校: lizheming 链接:http://www.zcfy.cc/article/3211 原文:https://cheesecakelabs.com/blog/jpg-png-svg-web-begin…

怎么卸载deepin linux,Linux deepin怎么卸载不用的旧内核_网站服务器运行维护,Linux...

鼠标右击没有新建word选项怎么解决_网站服务器运行维护鼠标右击没有新建word选项的解决方法:1、按【winr】组合键打开运行,输入【regedit】,点击【确定】;2、右键点击【.doc】文件夹,选择【新建】、【项】,…

织梦pc自适应网站伪静态教程

织梦pc自适应网站伪静态教程 一、 网站后台开启伪静态选项 二、网站后台设置整站为动态 织梦全站动态静态一键切换插件 三、电脑站伪静态教程开始 1、列表页和内容页伪静态链接 打开 /plus/list.php 找到 $tid (isset($tid) && is_numeric($tid) ? $tid : 0);改…

百度手机端网站域名展现近期调整

百度手机端网站域名展现近期调整 近期有站长发现,百度手机端搜索结果页面部分网站域名链接已经被网站品牌词所代替,效果类似于之前的熊掌号。 当然百度这样的调整对网站本身不产生影响,只是修改了网站域名的展现形式,将网站域名…

织梦将网站数据和文件整体打包操作流程

织梦怎么将网站数据和文件整体打包 首先登陆网站后台 - 点击系统 - 选择数据库备份/还原 - 点击提交(此步骤是备份网站数据文件) 等备份成功后,打开网站根目录文件夹 - 全选文件 - 打包为压缩包 (这样网站数据和网站文件都已经打…

织梦cms访问网站后台空白

织梦cms登陆网站后台显示空白页 网站程序:织梦v5.7 所遇问题:网站搬家,重新安装织梦网站,安装后直接访问网站后台显示空白 织梦cms登陆网站后台显示空白页解决方法 检查/include/common.inc.php文件配置信息是否正确,…

wpsppt设置页码和总页数_PDF格式转换、合并、分割、加水印、加页码各种操作,收藏这几个网站就够啦...

哈喽大家好,我是菌菌~日常工作中,我们经常会接触PDF格式文件它格式稳定,通用性高但不得不说,PDF着实让人又爱又恨爱它的方便和高兼容性恨它难以编辑修改虽然网上有不少PDF格式转换器但大多都是打着免费的旗号实际上要么限制次数要…

检查域名是否可以访问_网站无法访问了是怎么回事?可能是它出了错

【PConline 杂谈】你是否也遇到过这样的情况,就是当我们想访问一个网站时,页面显示的确是“无法访问此网站”,这是怎么回事?如果检查发现ping不通了,这可能就与DNS有关了。那么,啥是DNS?常听到的…

js入门·表单元素(select下拉列表)制作二级联动菜单和网站导航

对于脚本来说,最复杂的表单元素对象就是select了,他是一个复合对象,包含OPTION对象数组的对象 演示一:导航,这个多见于网站友情链接 请选择您要去的网站天轰穿系列教程博客园CSDN演示二:地区二级无刷新联动菜单&#x…

vscode将html页面部署到网站,快速入门:使用 Azure Static Web Apps 生成第一个静态站点...

您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.快速入门:使用 Azure Static Web Apps 生成第一个静态站点08/13/2020本文内容Azure Static Web App…

我的网站中的组织层次结构图信息与AD的同步问题

在MOSS中有一个“我的网站”,这是针对每个用户的一个特殊站点。在“我的档案”这个页面中会有一个组织层次结构,可以反映出用户在AD中的角色层次 这个页面里面有两个链接:开始完全导入 , 开始增量导入 也可以为完全导入或者增量导…

为什么某些网站有些地方打得开,有些地方打不开?

我们都知道,网站是由域名、空间、网页组成,如果这三部分中有其一出问题,网站都不能打开。我们在浏览器输入要访问的网站网址时,我们的计算机首先要找到这个网站放在那台服务器上,找到这台服务器后,再找这个…

linux终端全屏退出_不想装系统?这8个网站让你在线体验 Linux

点击上方“Python编程时光”,选择“加为星标”第一时间关注Python技术干货!来源:公众号【编程珠玑】作者:守望先生网站:https://www.yanbinghu.com是不是不想装虚拟机,还想体验一下Linux?是不是…

如何发布php网站_如何快速把数据发布到PHPWIND网站

简数采集提供发布到PHPWIND网站的插件,可非常轻松地把数据发布目标网站。采集结果数据发布到PHPWIND网站主要有三个步骤:步骤一 安装发布插件安装发布插件(在用户phpwind网站上进行的操作,插件基于phpwind-v9.0.2版本开发)下载简数采集phpwin…

vue和php网站下载,vue.js框架怎么下载

要下载安装vue首先得下载安装node.js和npm。下载安装好这两样以后就可以安装vue了。下面给大家介绍三种安装vue的方法。1.直接在官网上下载在官网上下载vue.js。并用注意:下载时网址是https://vuejs.org/v2/guide/installation.html。而不是https://cn.vuejs.org/v2…

linux网站环境软件下载,linux服务器WEB环境一键安装包及教程

时间:2013-07-17来源:源码库 作者:源码库 文章热度:℃lanmp/lamp/lnmp/lnamp一键安装包,快速安装包,linux服务器WEB环境一键安装包lanmp一键安装包是wdlinux官网2010年底开始推出的web应用环境的快速简易安装包.执行一个脚本,整个环境就安装完成就可使用&#xff0c…

关于网站应用程序池的帐号密码更改及其影响的实例分析

这个标题看起来有点绕,但其实是一个常见的问题,而且很多朋友对此的理解都不深。我这里用一个例子来解释一下 实例场景 我们有一个网站(名称为test),它使用了一个应用程序池(名称也为test)这个应用程序池所使用的用户帐号为app_pool_test这个帐…

八个移动产品设计必备网站

摘要: 好吧,又在爱库上发现了很棒的专辑,和大家分享!移动产品设计人员一定需要大量的使用其他各类应用,并且需要在产品设计时大量参考其他的移动应用的产品设计,这时如果有一些网站可以将很多优秀应用的不同流程分类展…

网站怎么备案?

富贵同学又又又又开新坑啦!!这个专栏要教大家的是如何从0搭建自己的网站,如果对你有帮助,记得收藏点赞一波哦!!! 上次教了大家如何购买域名: https://blog.csdn.net/csdnerM/article/details/12…