vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析
1.下载vue-cli
- npm install vue-cli -g
vue-cli的使用与详细介绍,可以到github上获取https://github.com/vuejs/vue-cli
2.安装webpack项目模版
- vue init <template-name> <project-name>
比如:
- vue init webpack my-project
之后可以在当前目录下下载该模版,然后
- npm install
安装所有的依赖包,可以得到如下的目录结构
3.目录结构与文件配置说明
- // 引入检查版本js模块
- require('./check-versions')()
- // 引入配置文件信息模块
- var config = require('../config')
- // 判断开发环境
- if (!process.env.NODE_ENV) process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
- // 引入nodejs的path模块,进行一些路径的操作,详情可以查看node官方的api
- var path = require('path')
- // 引入nodejs的一个框架express,可以帮助我们快速搭建一个node服务 github https://github.com/expressjs/express
- var express = require('express')
- // 引入node为webpack提供的一个模块服务 github https://github.com/webpack/webpack
- var webpack = require('webpack')
- // 可以指定打开指定的url使用指定的浏览器或者应用,详情可以去看一下github https://github.com/sindresorhus/opn
- var opn = require('opn')
- // 一个可以设置帮助我们进行服务器转发代理的中间件 https://github.com/chimurai/http-proxy-middleware
- var proxyMiddleware = require('http-proxy-middleware')
- // 根据当前启动环境选择加载相应的配置文件,webpack.prod.conf与webpack.dev.conf文件的说明后面也有
- var webpackConfig = process.env.NODE_ENV === 'testing'
- ? require('./webpack.prod.conf')
- : require('./webpack.dev.conf')
- // 端口号的设置
- var port = process.env.PORT || config.dev.port
- // 获取需要代理的服务api
- // https://github.com/chimurai/http-proxy-middleware
- var proxyTable = config.dev.proxyTable
- // 启动一个express服务
- var app = express()
- // 加载webpack配置
- var compiler = webpack(webpackConfig)
- // webpack的开发中间件,专门为webpack提供的一个简单的中间件,可以让文件都加载内存中,不去读写硬盘,并且当文件被改动的时候,不会刷新页面就会部署成功
- var devMiddleware = require('webpack-dev-middleware')(compiler, {
- publicPath: webpackConfig.output.publicPath,
- quiet: true
- })
- // 一个为webpack提供的热部署中间件。https://github.com/glenjamin/webpack-hot-middleware
- var hotMiddleware = require('webpack-hot-middleware')(compiler, {
- log: () => {}
- })
- // 当html被改变的时候,让html被强制部署,使用这个中间件html-webpack-plugin,https://github.com/ampedandwired/html-webpack-plugin
- compiler.plugin('compilation', function (compilation) {
- compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
- hotMiddleware.publish({ action: 'reload' })
- cb()
- })
- })
- // 遍历代理的配置信息,并且使用中间件加载进去
- Object.keys(proxyTable).forEach(function (context) {
- var options = proxyTable[context]
- if (typeof options === 'string') {
- options = { target: options }
- }
- app.use(proxyMiddleware(context, options))
- })
- // 当访问找不到的页面的时候,该中间件指定了一个默认的页面返回https://github.com/bripkens/connect-history-api-fallback
- app.use(require('connect-history-api-fallback')())
- // 使用中间件
- app.use(devMiddleware)
- // 热部署
- app.use(hotMiddleware)
- // 根据配置信息拼接一个目录路径,然后将该路径下的文件交给express的静态目录管理
- var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
- app.use(staticPath, express.static('./static'))
- var uri = 'http://localhost:' + port
- devMiddleware.waitUntilValid(function () {
- console.log('> Listening at ' + uri + '\n')
- })
- // 导出的对象
- module.exports = app.listen(port, function (err) {
- if (err) {
- console.log(err)
- return
- }
- // when env is testing, don't need open it
- if (process.env.NODE_ENV !== 'testing') {
- opn(uri)
- }
- })
webpack.base.conf.js
- var path = require('path')
- var config = require('../config')
- // 工具类,下面会用到
- var utils = require('./utils')
- // 工程目录,就是当前目录build的上一层目录
- var projectRoot = path.resolve(__dirname, '../')
- var env = process.env.NODE_ENV
- // 是否在开发环境中使用cssSourceMap,默认是false,该配置信息在config目录下的index.js中可以查看
- var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap)
- var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap)
- var useCssSourceMap = cssSourceMapDev || cssSourceMapProd
- // 导出的对象,就是webpack的配置项,详情可以参考的webpack的配置说明,这里会将出现的都一一说明一下
- module.exports = {
- // 指明入口函数
- entry: {
- app: './src/main.js'
- },
- // 输出配置项
- output: {
- // 路径,从config/index读取的,值为:工程目录下的dist目录,需要的自定义的也可以去修改
- path: config.build.assetsRoot,
- // 发布路径,这里是的值为/,正式生产环境可能是服务器上的一个路径,也可以自定义
- publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
- filename: '[name].js'
- },
- // 配置模块如何被解析,就是import或者require的一些配置
- resolve: {
- // 当使用require或者import的时候,自动补全下面的扩展名文件的扩展名,也就是说引入的时候不需要使用扩展名
- extensions: ['', '.js', '.vue', '.json'],
- // 当我们require的东西找不到的时候,可以去node_modules里面去找,
- fallback: [path.join(__dirname, '../node_modules')],
- // 别名,在我们require的时候,可以使用这些别名,来缩短我们需要的路径的长度
- alias: {
- 'vue$': 'vue/dist/vue.common.js',
- 'src': path.resolve(__dirname, '../src'),
- 'assets': path.resolve(__dirname, '../src/assets'),
- 'components': path.resolve(__dirname, '../src/components')
- }
- },
- // 同上
- resolveLoader: {
- fallback: [path.join(__dirname, '../node_modules')]
- },
- // 对相应文件的编译使用什么工具的配置
- module: {
- // loader之前的配置,会对.vue,.js的文件用eslint进行编译,include是包含的文件,exclude是排除的文件,可以使用的正则
- preLoaders: [
- {
- test: /\.vue$/,
- loader: 'eslint',
- include: [
- path.join(projectRoot, 'src')
- ],
- exclude: /node_modules/
- },
- {
- test: /\.js$/,
- loader: 'eslint',
- include: [
- path.join(projectRoot, 'src')
- ],
- exclude: /node_modules/
- }
- ],
- // 这里也是相应的配置,test就是匹配文件,loader是加载器,
- // query比较特殊,当大小超过10kb的时候,会单独生成一个文件,文件名的生成规则是utils提供的方法,当小于10kb的时候,就会生成一个base64串放入js文件中
- loaders: [
- {
- test: /\.vue$/,
- loader: 'vue'
- },
- {
- test: /\.js$/,
- loader: 'babel',
- include: [
- path.join(projectRoot, 'src')
- ],
- exclude: /node_modules/
- },
- {
- test: /\.json$/,
- loader: 'json'
- },
- {
- test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
- loader: 'url',
- query: {
- limit: 10000,
- name: utils.assetsPath('img/[name].[hash:7].[ext]')
- }
- },
- {
- test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
- loader: 'url',
- query: {
- limit: 10000,
- name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
- }
- }
- ]
- },
- // eslint的配置
- eslint: {
- formatter: require('eslint-friendly-formatter')
- },
- // vue-loader的配置
- vue: {
- loaders: utils.cssLoaders({ sourceMap: useCssSourceMap }),
- postcss: [
- require('autoprefixer')({
- browsers: ['last 2 versions']
- })
- ]
- }
- }
webpack.dev.comf.js
- var config = require('../config')
- var webpack = require('webpack')
- // https://github.com/survivejs/webpack-merge 提供一个合并生成新对象函数
- var merge = require('webpack-merge')
- var utils = require('./utils')
- var baseWebpackConfig = require('./webpack.base.conf')
- var HtmlWebpackPlugin = require('html-webpack-plugin')
- var FriendlyErrors = require('friendly-errors-webpack-plugin')
- // 在浏览器不刷新的情况下,也可以看到改变的效果,如果刷新失败了,他就会自动刷新页面
- Object.keys(baseWebpackConfig.entry).forEach(function (name) {
- baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
- })
- module.exports = merge(baseWebpackConfig, {
- module: {
- // 后面会有对utils的解释,这里是对单独的css文件,用相应的css加载器来解析
- loaders: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
- },
- // 在开发模式下,可以在webpack下面找到js文件,在f12的时候,
- devtool: '#eval-source-map',
- // 将webpack的插件放入
- plugins: [
- // 通过插件修改定义的变量
- new webpack.DefinePlugin({
- 'process.env': config.dev.env
- }),
- // webpack优化的这个一个模块,https://github.com/glenjamin/webpack-hot-middleware#installation--usage
- new webpack.optimize.OccurrenceOrderPlugin(),
- // 热加载
- new webpack.HotModuleReplacementPlugin(),
- // 当编译出现错误的时候,会跳过这部分代码
- new webpack.NoErrorsPlugin(),
- // filename生成的文件名,template是模版用的文件名,https://github.com/ampedandwired/html-webpack-plugin
- new HtmlWebpackPlugin({
- filename: 'index.html',
- template: 'index.html',
- // 让打包生成的html文件中css和js就默认添加到html里面,css就添加到head里面,js就添加到body里面
- inject: true
- }),
- new FriendlyErrors()
- ]
- })
utils.js和config目录下面的js文件都比较好辨认是干什么的,config下面都是配置信息,json对象,很好理解,utils下面就是导出了几个常用的方法,主要也就是用在了上述的几个js文件里面,另外关于生产阶段和测试阶段的js说明,后面会有文章说明
项目中配置的config/index.js,有dev和production两种环境的配置 以下介绍的是production环境下的webpack配置的理解

1 var path = require('path')
2
3 module.exports = {
4 build: { // production 环境
5 env: require('./prod.env'), // 使用 config/prod.env.js 中定义的编译环境
6 index: path.resolve(__dirname, '../dist/index.html'), // 编译输入的 index.html 文件
7 assetsRoot: path.resolve(__dirname, '../dist'), // 编译输出的静态资源路径
8 assetsSubDirectory: 'static', // 编译输出的二级目录
9 assetsPublicPath: '/', // 编译发布的根目录,可配置为资源服务器域名或 CDN 域名
10 productionSourceMap: true, // 是否开启 cssSourceMap
11 // Gzip off by default as many popular static hosts such as
12 // Surge or Netlify already gzip all static assets for you.
13 // Before setting to `true`, make sure to:
14 // npm install --save-dev compression-webpack-plugin
15 productionGzip: false, // 是否开启 gzip
16 productionGzipExtensions: ['js', 'css'] // 需要使用 gzip 压缩的文件扩展名
17 },
18 dev: { // dev 环境
19 env: require('./dev.env'), // 使用 config/dev.env.js 中定义的编译环境
20 port: 8080, // 运行测试页面的端口
21 assetsSubDirectory: 'static', // 编译输出的二级目录
22 assetsPublicPath: '/', // 编译发布的根目录,可配置为资源服务器域名或 CDN 域名
23 proxyTable: {}, // 需要 proxyTable 代理的接口(可跨域)
24 // CSS Sourcemaps off by default because relative paths are "buggy"
25 // with this option, according to the CSS-Loader README
26 // (https://github.com/webpack/css-loader#sourcemaps)
27 // In our experience, they generally work as expected,
28 // just be aware of this issue when enabling this option.
29 cssSourceMap: false // 是否开启 cssSourceMap
30 }
31 }

vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析的更多相关文章
- Vue CLI Webpack 创建Vue项目
简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手,还 ...
- 转:vue-cli的webpack模板项目配置文件分析
转载地址:http://blog.csdn.net/hongchh/article/details/55113751 一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件, ...
- 《转》vue-cli的webpack模板项目配置文件注释
一.文件结构 本文主要分析开发(dev)和构建(build)两个过程涉及到的文件,故下面文件结构仅列出相应的内容. ├─build │ ├─build.js │ ├─check-versions.js ...
- [置顶] vue-cli的webpack模板项目配置文件分析
2017-09-11更新:更新到webpack 2.6.1所对应的配置,完善部分代码注释. 由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和c ...
- 【Vue CLI】从安装到构建项目再到目录结构的说明
目录 1. 构建我们的项目 2. 目录结构说明 2.1 build目录 2.2 config目录 2.3 src目录 2.4 static目录 "Vue CLI是一个基于Vue.js进行快速 ...
- Vue技术点整理-Vue CLI
Vue CLI 是一个基于 Vue.js 进行项目快速开发的脚手架 注:具体安装步骤可参考Vue CLI,默认安装的脚手架,是没有service.util等工具类的,以下主要描述如何在脚手架的基础上进 ...
- webpack 4 & dev server
webpack 4 & dev server proxy https://webpack.js.org/configuration/dev-server/#devserverproxy htt ...
- Vue Cli 中使用 Karma / Chrome 执行样式相关单元测试
在 GearCase 开源项目 中,我使用了 Vue Cli 的默认测试框架.因此和样式相关的东西,都无法进行测试.因为它并不类似于无头浏览器,而是存在于虚拟内存之中. 现状 在如下 button.s ...
- vue-cli脚手架npm相关文件解读(3)webpack.dev.conf.js
系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...
随机推荐
- LiveBlox无需代码的开发工具--支持win macos ubuntu等开发环境--
LiveBlox无需代码的开发工具-支持windows macos ubuntu. 强大 灵活 易于使用 视频简介:LiveBlox Develop Technology Without Coding ...
- 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解
这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序. * 排序有两种方式 * A:自然排序: 从小到大排序 * B:比较器排序 Comp ...
- iOS中 图文混排/自定义图文混排 作者:韩俊强
指示根视图:(准备几张图片,把label加载在window上) CustomLable *label = [[CustomLable alloc]initWithFrame:CGRectMake(0, ...
- UNIX环境高级编程——Linux系统调用列表
以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...
- 牛腩新闻发布系统--学习Web的小技巧汇总
2014年11月10日,是个难忘的日子,这一天,小编的BS学习开始了,BS的开头,从牛腩新闻发布系统开始,之前学习的内容都是CS方面的知识,软考过后,开始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...
- 04-GIT TortoiseGit冲突和补丁演示 案例演示
TortoiseGit安装下载 http://download.tortoisegit.org/tgit/1.8.12.0/ 或https://code.google.com/p/tortoisegi ...
- Android实现自定义的相机
使用系统相机 android中使用系统相机是很方便的,单这仅仅是简单的使用而已,并不能获得什么特殊的效果. 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 < ...
- (三十三)Xcode项目的重要工程文件
1.Supporting files内有一个Xxx-Info.plist文件(旧版本Xcode的配置文件叫Info.plist).因此自定义的plist不要带Info关键词. 这个plist是系统的全 ...
- git使用详解
1. Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本 ...
- PLSQL_R12 MOAC多组织的四个应用(案例)
一.摘要 R12 Form 或者其他二次开发时,很多情况下会涉及R12 MOAC多组织开发,以下介绍了4个常见的应用,如有遗漏还请学友继续补充 1. 开发时打开Form自动弹出组织选择实现方式(增加C ...