只知道Webpack怎么拼怎么用的我。。被领导委托搭建移动端项目框架。。。javascript
此时的我:css
咱虽然对Webpack一窍不通,也得保持风度html
“那个大哥,咱这边移动端用啥UI框架?”vue
“得过几天想一想。。搞很差我们本身手写一套”java
这时候个人动力来了:UI框架?作UI框架不是我一直求之不得的事情吗?webpack
“好的老板。必定完成任务”web
熟练的打开PowerShell,把vue脚手架搞好,把多页面跟着教程配置好。segmentfault
OK,接下来遇到难题了:bash
这个配置方式只支持最基本的多页面!!服务器
什么意思呢?若是我在src/page下建立一个passport文件夹。里面放好同名html js vue文件后,再在passport文件夹下建立一个reg文件夹,里面放同名页面架构。这样会形成reg.html没法打包。
想了一下,这种问题通常是通配符的缘由。多是通配符不够深。
可是看了一眼webpack相关配置文件夹。。顿时就怕了。。。
这都是些啥玩意。。。每一个文件都表明什么啊。。
因而我花了一下午的时间本身捋了一下。差很少就这个意思(如图)
1.build.js //webpack的核心打包工具。
2.webpack.*.conf.js //webpack的独立环境配置和插件配置。如生产环境,测试环境等。通常每一个环境一个文件
2.webpack.base.conf.js //配置项目目录别名,资源文件打包配置的地方(src/assets)
3.*.env.js //配置项目环境私有变量的地方
4.index.js //配置项目打包后资源文件路径,dev环境端口号和服务器配置的地方
OK,基本缕清了webpack架构以后,让咱们验证猜测吧。
果不其然,在配置完多页面以后。教程中一段代码是这么寻找的js/html
(原谅我第一张图忘记画箭头了)
果然是通配符方式查找页面JS。因而改为/**/*.js ,/**/*.html。果然解决问题
好的 如今咱们2级子页面终于找到了。可是打包发现有点问题。such as
打包前:
打包后:
很好 二级页面变为了一级页面
那我访问passport/reg.html岂不是就访问不到了?
这种问题确定不能去容忍。因而我着手解决这个问题。
因而在utils.js文件内 找到了这样一行代码:
这段代码的意思是找到绝对路径的最后一个“/”和它后面的最后一个“ . ”截取其中的文件名。而后打包出来
有点意思。至关于若是个人目录是D:/demo/src/page/index/index.js 他就会截取index。
若是个人目录是D:/demo/src/page/passport/reg/reg.js 他就会只截取reg。这样就会形成输出的文件是同级目录。
找到病因了,那就解决呗。
因而换一种思路去想:既然个人页面都是在src/page文件夹下。那我找到page后面的“/”而后一直截取到最后一个“.” 这样他不就带层级关系了吗??
因而把代码换成这个:
let filename = filePath.substring(filePath.indexOf("pages") + 6, filePath.lastIndexOf('.'))复制代码
这段代码的意思是先找到“pages”的下标,而后+6个下标找到pages后面的“/”。最后截取到最后一个“.”
因而reg页面输出为:
/passport/reg/reg
OK 这时候再次打包 发现目录层级终于正确了
这下终于有个项目架构的样子了。可是大哥还不满意:
“这样,你把css和js文件放在html同级目录下吧。不要让他在单独的文件夹内了”
what??这又是什么鬼??
通过观察,打包后的资源文件放在了static文件夹下。顺藤摸瓜,找到了一个看起来像是资源目录配置的属性
assetsSubDirectory: 'static',
因而我把他换成了:
assetsSubDirectory: '',
这样打包后,发现css js文件夹和页面文件夹同级了??
这样比以前更乱了。。
因而找了许久,在webpack.*.conf.js 文件内找到了js/css输出的相对路径
这段代码的大致意思根据css/js文件名模板输出打包后的文件。可是前面加一个文件夹的路径,他也会自动建立该文件夹
因而把css/ 和js/去掉。成功解决问题
太开心了!!这下项目架构应该正常了吧
让我跑一下看看。。嗯。。图片怎么跑出来和页面文件夹同级了??
难不成....是刚才去掉static为资源输出文件夹的问题??
经过查看谁在使用“assetsSubDirectory”这个属性时,发现了一个叫 CopyWebpackPlugin的webpack插件
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])复制代码
查了一下webpack的document文档。插件的做用是,将你项目资源文件夹原封不动地copy到你打包目录的某个文件夹。
那这样就好解决了,我把to写死了不久就ok了么
to: './static'复制代码
这样打包下来,资源和代码都正常了。感受还有点小成就感
这时候,老大又发话了:
“我们这个系统是有好多环境的。不一样的环境有不一样的网关”
这可难住我了。。到最后仔细看了一下,其实就是每一个环境不一样的专属常量而已。。方便接口地址不须要写域名。直接get全局网关+路径就行
因而我每一个环境都copy了一份不一样的webpack.*.conf.js ,*.env.js。其中*.env.js是存储环境私有常量的
*.env.js配置以下:
'use strict'
const merge = require('webpack-merge')
module.exports = {
NODE_ENV: '"development"', //区别线上环境/生产环境的变量
SERVER_URL: '" **** "', //网关。一般用于接口域名配置
IS_DEBUG: true //是否容许开启Vue Tools
}
复制代码
而后webpack.*.conf.js须要配置一下:
const env = require('../config/dev.env');复制代码
这样你在你本身的代码中就能够获取全局常量了
示例:
<template>
<div class="aaa">
<span>
这是index {{getBaseURL}}
</span>
</div>
</template>
<script>
export default {
name: "index",
computed: {
getBaseURL() {
return process.env.SERVER_URL; //返回网关地址
}
}
}
</script>
<style scoped>
.aaa {
color: red;
}
</style>复制代码
而后页面正确显示网关地址
至此。整个项目框架基础部分算是搭建完毕。搭建完毕后我对webpack也了解个一半左右了....
固然,UI框架的制做心得我在后期总结完毕也会写出来。感谢你们支持!
参考资源: