vue-cliwebpack模板项⽬搭建及打包时路径问题的解决⽅
法
这⾥建议刚学vue的同学第⼀个⼩案例不要使⽤vue-cli进⾏操作,待对基本的api使⽤的⽐较顺⼿了之后再进⾏vue-cli的体验⽐较好。本⼈是⼀名后端开发⼈员,接触前端时间不长,这⾥有说的不好的地⽅,还请⼤家评论建议下。
1. 安装必要的环境准备
⾸先我们要能够暗转node.js,这个环境。百度搜索node,进⼊官⽹根据⾃⼰的操作系统进⾏下载即可。现在的版本都是⾃带npm的了。所以安装后,环境变量正常情况下会⾃动配置,开启⼀个命令⾏终端,输⼊node,npm,就可以看到相应的信息。那么说明安装成功。
2. cnpm
由于我们在国内,所以npm的下载路径对我们来说是很慢的,因此我们要使⽤淘宝提供的cnpm镜像(与maven镜像是⼀个效果。)百度搜索cnpm,点击进⾏官⽹,⾥⾯的教程很详细,这⾥也不会啰嗦了。
3. 正式搭建vue-cli
我们⾸先进⾏vue-cli的⼀个下载:
cnpm install -g vue-cli
⾥⾯会跟着将webpack⼀起下载下来,如果没有,那么我们也可以⼿动⾃⼰下载⼀下webpack就好了,命令相同,只是把vue-cli换成webpack。
下载好之后,进⼊⼀个合适的⽬录,然后输⼊:
vue-cli webpack vuedemo1
webpack参数是指:我们使⽤webpack的这套模板
Vuedemo1指:我们在此⽬录下新建⼀个名字叫做vuedemo1的⽬录并将其作为项⽬的跟⽬录。
这样,⼀个空的vue-cli项⽬就搭建好了
测试⼀下,输⼊:
npm run dev
默认开启8080端⼝,并打开默认浏览器,看到⼀个熟悉的vue的页⾯。
4. 配置⽂件讲解
本⾝对配置⽂件理解的并不是特别深刻,这⾥将⾃⼰了解的⼀些配置含义写出来,共同学习⼀下。
bulid⽬录下⾯的fig.js:这⾥⼀般是⼀些基础信息的配置,⽤过webpack的⼩伙伴应该都⽐较熟悉,这⾥简单讲解⼀下各个属性:
input:代表⼊⼝⽂件,这⾥⼀般指定的是index.html
output:出⼝⽂件。
module:这⾥⼀般写的的针对各个⽂件的配置的解析loader。
resolve:这⾥指其他配置,⾥⾯⼀般有:alias:起别名,例如:
alias: {
‘vue$': ‘vue/dist/vue.esm.js',
‘@': resolve(‘src'),
‘RegForm': ‘@/components/RegForm.vue' //新增
}
我这⾥新增⼀个别名,代表⼀个路径,这样,以后要引⼊这个vue⽂件的时候,直接:
import Regfrom from “RegForm”就可以了。
前⾯加@,因为默认的配置中将@,取名为resolve('src'),解析了绝对路径。
build下⾯dev-server.js:
// 检查NodeJS和npm的版本
require('./check-versions')()
// 获取配置
var config = require('../config')
// 如果Node的环境变量中没有设置当前的环境(NODE_ENV),则使⽤config中的配置作为当前的环境if (!v.NODE_ENV) {
}
// ⼀个可以调⽤默认软件打开⽹址、图⽚、⽂件等内容的插件
// 这⾥⽤它来调⽤默认浏览器打开dev-server监听的端⼝,例如:localhost:8080
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
// ⼀个express中间件,⽤于将http请求代理到其他服务器
// 例:localhost:8080/api/xxx --> localhost:3000/api/xxx
// 这⾥使⽤该插件可以将前端开发中涉及到的请求代理到API服务器上,⽅便与服务器对接
var proxyMiddleware = require('http-proxy-middleware')
/
/ 根据 Node 环境来引⼊相应的 webpack 配置
var webpackConfig = v.NODE_ENV === 'testing'
require('./f')
: require('./f')
// dev-server 监听的端⼝,默认为config.dev.port设置的端⼝,即8080
var port = v.PORT || config.dev.port
// ⽤于判断是否要⾃动打开浏览器的布尔变量,当配置⽂件中没有设置⾃动打开浏览器的时候其值为 false var autoOpenBrowser = !!config.dev.autoOpenBrowser
// 定义 HTTP 代理表,代理到 API 服务器
var proxyTable = config.dev.proxyTable
// 创建1个 express 实例
var app = express()
// 根据webpack配置⽂件创建Compiler对象
var compiler = webpack(webpackConfig)
// webpack-dev-middleware使⽤compiler对象来对相应的⽂件进⾏编译和绑定
// 编译绑定后将得到的产物存放在内存中⽽没有写进磁盘
// 将这个中间件交给express使⽤之后即可访问这些编译后的产品⽂件
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
// webpack-hot-middleware,⽤于实现热重载功能的中间件
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// 当html-webpack-plugin提交之后通过热重载中间件发布重载动作使得页⾯重载
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// 将 proxyTable 中的代理请求配置挂在到express服务器上
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
// 格式化options,例如将'ample'变成{ target: 'ample' }
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
// 重定向不存在的URL,常⽤于SPA
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
/
/ 使⽤webpack开发中间件
// 即将webpack编译后输出到内存中的⽂件资源挂到express服务器上
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
// 将热重载中间件挂在到express服务器上
app.use(hotMiddleware)
// serve pure static assets
// 静态资源的路径
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
// 将静态资源挂到express服务器上
app.use(staticPath, express.static('./static'))
// 应⽤的地址信息,例如:localhost:8080
var uri = 'localhost:' + port
// webpack开发中间件合法(valid)之后输出提⽰语到控制台,表明服务器已启动devMiddleware.waitUntilValid(function () {
console.log('> Listening at ' + uri + '\n')
})
// 启动express服务器并监听相应的端⼝(8080)
if (err) {
console.log(err)
return
}
// when env is testing, don't need open it
// 如果符合⾃动打开浏览器的条件,则通过opn插件调⽤系统默认浏览器打开对应的地址uri
if (autoOpenBrowser && v.NODE_ENV !== 'testing') {
opn(uri)
}
})
3.build/f.js (npm run dev⽤到的配置⽂件 )
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
/
/ ⼀个可以合并数组和对象的插件
var merge = require('webpack-merge')
var baseWebpackConfig = require('./f')
// ⼀个⽤于⽣成HTML⽂件并⾃动注⼊依赖⽂件(link/script)的webpack插件
var HtmlWebpackPlugin = require('html-webpack-plugin')
// ⽤于更友好地输出webpack的警告、错误等信息
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.).forEach(function (name) {
<[name] = ['./build/dev-client'].[name]) })
// 合并基础的webpack配置
// 配置样式⽂件的处理规则,使⽤styleLoaders
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// 配置Source Maps。在开发中使⽤cheap-module-eval-source-map更快
devtool: '#cheap-module-eval-source-map',
// 配置webpack插件
plugins: [
new webpack.DefinePlugin({
'v': v
}),
// github/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
// 后页⾯中的报错不会阻塞,但是会在编译结束后报错
new webpack.NoEmitOnErrorsPlugin(),
// github/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})
4.build/build.js
// github/shelljs/shelljs
// 检查NodeJS和npm的版本
require('./check-versions')()
// Elegant terminal spinner
var ora = require('ora')
var path = require('path')
/
/ ⽤于在控制台输出带颜⾊字体的插件
var chalk = require('chalk')
// 执⾏Unix命令⾏的插件
var shell = require('shelljs')
var webpack = require('webpack')
var config = require('../config')
var webpackConfig = require('./f')
var spinner = ora('building ')
spinner.start() // 开启loading动画
// 输出⽂件的⽬标⽂件夹
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory) // 递归删除旧的⽬标⽂件夹
<('-rf', assetsPath)
// 重新创建⽂件夹
shell.mkdir('-p', assetsPath)
// 将static⽂件夹复制到输出的⽬标⽂件夹
shell.cp('-R', 'static/*', assetsPath)
// webpack编译
webpack(webpackConfig, function (err, stats) {
spinner.stop() // 停⽌loading动画
if (err) throw err
/
/ 没有出错则输出相关信息
process.stdout.String({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
console.an(' Build complete.\n'))
console.llow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
5.build/f.js (npm run build⽤到的配置⽂件)
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./f')
var HtmlWebpackPlugin = require('html-webpack-plugin')
/
/ ⽤于从webpack⽣成的bundle中提取⽂本到特定⽂件中的插件
// 可以抽取出css,js⽂件将其与webpack输出的bundle分离
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = v.NODE_ENV === 'testing'
require('../v')
: v
// 合并基础的webpack配置
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
webpack打包流程 面试},
devtool: config.build.productionSourceMap ? '#source-map' : false,
// 配置webpack的输出
output: {
// 编译输出⽬录
path: config.build.assetsRoot,
// 编译输出⽂件名格式
filename: utils.assetsPath('js/[name].[chunkhash].js'),
// 没有指定输出名的⽂件输出的⽂件名格式
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
// 配置webpack插件
plugins: [
// vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'v': env
}),
// 丑化压缩代码
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// 抽离css⽂件
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see github/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: v.NODE_ENV === 'testing'
'index.html'
: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
/
/ github/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
/\.js$/.source) &&
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
})
]
})
// gzip模式下需要引⼊compression插件进⾏压缩
if (config.build.productionGzip) {
var 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) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论