zoukankan      html  css  js  c++  java
  • 改造 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  
    

    注意

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

  • 相关阅读:
    JUnit手记
    Guava手记
    深表浅表拷贝
    异常问题仓库
    记录一次“记录超长”
    高二数学微课堂[教学视频]
    高一数学微课堂[教学视频]
    用导数研究函数的性质
    均值不等式的常见使用技巧
    一元二次方程根的分布
  • 原文地址:https://www.cnblogs.com/CccZss/p/8535635.html
Copyright © 2011-2022 走看看