改造 vue-cli 脚手架

改造 vue-cli 脚手架

注意,这里使用的 vue-cli 的版本为 2.8.2,不同版本的 vue-cli 可能会有些许不一样。

一、配置多页面

项目开发目录:

需要注意一点,每个页面的文件夹命名、文件夹里面的入口 js 文件名及 hmtl 模板文件名应该一致,这样就可以使用一个函数来自动配置入口文件,而不必手动配置

project/
    ├──build/
    ├──config/
    ├──node_modules/
    ├──src/
    │  ├──assets/
    │  ├──components/
    │  ├──html/
    │  │  ├──pageOne/
    │  │  │  ├──components/
    │  │  │  ├──route/            // 如果有使用 vue-route
    │  │  │  ├──store/            // 如果有使用 vueX
    │  │  │  ├──style/
    │  │  │  ├──APP.vue
    │  │  │  ├──pageOne.html
    │  │  │  ├──pageOne.js
    │  │  ├──pageTwo/
    │  │  │  ├──components/
    │  │  │  ├──route/
    │  │  │  ├──store/
    │  │  │  ├──style/
    │  │  │  ├──APP.vue
    │  │  │  ├──pageTwo.html
    │  │  │  ├──pageTwo.js
    │  ├──utils/
    ├──static/
    ├──babelrcc
    ├──.editorconfig
    ├──.gitgnore
    ├──package.json
    ├──README.md

项目打包目录

dist
    ├──html/
    │  ├──pageOne.html
    │  ├──pageTwo.html
    ├──static/
    │  ├──img/
    │  ├──fonts/
    │  ├──css/
    │  │  ├──html/
    │  │  │  ├──pageOne.css
    │  │  │  ├──pageTwo.css
    │  │  ├──other.css
    │  ├──js/
    │  │  ├──html/
    │  │  │  ├──pageOne.js
    │  │  │  ├──pageTwo.js
    │  │  ├──manifest.js
    │  │  ├──vendor.js
    ├──favicon.ico

1. 添加入口工具函数

// build/utils.js

var glob = require('glob');

exports.getEntries = function (globPath) {
    var entries = {}
    /**
     * 读取src目录,并进行路径裁剪
     */
    glob.sync(globPath).forEach(function (entry) {
        /**
         * path.basename 提取出用 ‘/' 隔开的path的最后一部分,除第一个参数外其余是需要过滤的字符串
         * path.extname 获取文件后缀
         */
        var basename = path.basename(entry, path.extname(entry)) // 过滤router.js
        // ***************begin***************
        // 当然, 你也可以加上模块名称, 即输出如下: { module/main: './src/module/index/main.js', module/test: './src/module/test/test.js' }
        // 最终编译输出的文件也在module目录下, 访问路径需要时 localhost:8080/module/index.html
        // slice 从已有的数组中返回选定的元素, -3 倒序选择,即选择最后三个
        var tmp = entry.split('/').splice(-3)
        if(basename!==tmp[1]) return;  //过滤其他js文件
        var pathname = tmp.splice(0, 1) + '/' + basename; // splice(0, 1)取tmp数组中第一个元素
        entries[pathname] = ['babel-polyfill',entry]
    });
    return entries;
}

/* 变量值
    entry:     ../src/html/index/index.js
    basename:   index
    tmp:        [ 'html', 'index', 'index.js' ]
    pathname:   html/index
    enteries:   { 
                    'html/index': '../src/html/index/index.js',
                    'html/first': '../src/html/first/first.js' 
                }
*/

2. 修改入口配置

// bulid/webpack.base.conf.js

module.exports = {
entry: utils.getEntries('./src/html/*/*.js'),
    ...
}

3. 修改 HtmlWebpackPlugin 配置

// bulid/webpack.dev.conf.js

# 1. 引入工具函数
var utils = require('./utils') 

# 2. 注释掉原来的 HtmlWebpackPlugin 配置,大概在 29 行

# 3. 在文件末尾加入下面代码
var pages = utils.getEntries('./src/html/*/*.html');
for (var pathname in pages) {
    // 配置生成的html文件,定义路径等
    var conf = {
    favicon: "favicon.ico",
    filename: pathname + '.html',
    template: pages[pathname][1],   // 模板路径
    inject: true,              // js插入位置
    excludeChunks: Object.keys(pages).filter(item => {
        return (item != pathname)
    })
    };
    module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}
// bulid/webpack.prod.conf.js

// 1. 注释掉原来的 HtmlWebpackPlugin 配置,大概在 52 行
// 2. 在文件末尾加入下面代码

var pages = utils.getEntries('./src/html/**/*.html');

for (var pathname in pages) {
    // 配置生成的html文件,定义路径等
    var conf = {
    favicon: "favicon.ico",
    filename: pathname + '.html',
    template:  pages[pathname][1],   // 模板路径
    inject: true,              // js插入位置
    minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
        },
    // necessary to consistently work with multiple chunks via CommonsChunkPlugin
    chunksSortMode: 'dependency',
    };
    if (pathname in module.exports.entry) {    //为页面导入所需的依赖
    conf.chunks = ['vendor','manifest', pathname];
    conf.hash = false;
    }
    module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

4. 修改默认打开路径

// bulid/dev-server.js

var uri = 'http://localhost:' + port + '/' + Object.getOwnPropertyNames(utils.getEntries('./src/html/*/*.html'))[0] + '.html'

5. 修改打包路径为相对路径

// config/index.js

bulid: {
    assetsPublicPath: '../',
}

6. 修改打包后 css 文件中对 图片和字库文件引用路径出错的的问题

// build/utils

// 38行
if (options.extract) {
    return ExtractTextPlugin.extract({
        use: loaders,
        publicPath: '../../../',         // 修改这里
        fallback: 'vue-style-loader'
    })
} else {
    return ['vue-style-loader'].concat(loaders)
}

7. 检测浏览器版本

<!-- 在模板 html 中引入 -->

<script>
if (!+"\v1") {
    document.body.innerHTML = "<div style='background: #00a1d6; text-align: center; padding: 10px 0; color: #fff;'>为了保护你的账号安全,Anywork已不支持IE8及以下版本浏览器访问,建议你升级到IE最新版本浏览器,或使用Chrome等其他浏览器。</div>"
}
</script>

二、配置跨域代理

1. 定义接口工具函数,使用 axios 规定访问路径

// src/utils/interaction.js

import axios from 'axios'

export const IP = '/anywork/';
export const myAxios = axios.create({
baseURL: IP,
// withCredentials: true
})

2. 添加跨域配置

// config/index.js

module.exports = {
    dev: {
    proxyTable: {
        '/anywork': {
            target: 'http://10.21.48.11:8080',
            changeOrigin: true,
            pathRewrite: {
                '^/anywork': '/anywork'
            }
        }
    },
}

三、配置常用 loader 和 依赖项

1. 引入 less

npm 下载

$ cnpm install less less-loader --save-dev

webpack.base.conf.js 配置

// 在 rules 中引入 loader

{
    test: /\.less$/,
    include: [
    path.resolve(__dirname, "not_exist_path")
    ],
    loader: 'style-loader!css-loader!less-loader'
},

2. 引入 stylus

npm install stylus stylus-loader --save-dev
<style scoped lang="stylus">
</style>

3. 引入 babel-polyfill

使 IE9 能使用一些 ES6 的新特性

先引入垫片

npm install bable-ployfill --save

方式一:通过 import 引入

// 入口文件
import 'babel-polyfill'

方式二:通过webpack 入口引入

// webpack.conf.js

module.exports = {
	entry: ['babel-polyfill', entry-file-URL]
}

4. 引入其他

npm install axios --save   
npm install iview --save    // UI库
npm install vuex --save  

注意

转载、引用,但请标明作者和原文地址

posted @ 2018-03-09 19:47  另一个小菜头  阅读(321)  评论(0编辑  收藏  举报