WebPack在多页运用项目中的探究

WebPack在项目设置中的探究(延续更新中)

  • webpack + gulp + vue (thinkPHP背景设置)

一、项目需求(请仔细看目次构造,项目构建许多数基于目次来的)

--- Application
    |--- Home
    |   |--- View (线上用户接见的.html目次)
--- Public (线上资本文件目次)
    |--- js
    |--- images
    |--- css
    |--- ...
--- source (前端开辟目次)
    |--- index (一个营业需求模块,每一个营业需求模块下会有许多页面)
    |    |--- index (index 页面)
    |    |      |--- images    
    |    |    |--- index.html 
    |    |    |--- app.vue
    |    |    |--- index.js
    |    |    |--- style.scss
    |    |    |--- ...
    |    |--- topics (topics 页面)
    |    |    |--- images
    |    |    |--- topics.html
    |      |      |    ...
    |--- crowd (别的一个营业需求模块,每一个营业需求模块下会有许多页面)          
    |    |--- index 
    |    |    |--- index.html
  

以上是我们的一个项目构造

  • 1.我所想要的是每一个营业需求模块下(source/index)会有许多页面

  • 每一个页面都是一个文件夹(source/index/index,source/index/topics)

  • 2.项目无需背景环境浏览器能够直接翻开接见

  • 3.每一个页面资本如.sass文件,.js文件等就近保护,用.vue + es6的情势举行组件模块化的开辟

  • 4.开辟时具有优越的sourseMap调试

  • 5.当我们不须要这个营业模块,或许某个页面的时刻能够直接删除悉数文件夹即可

webpack会协助我们会为每一个页面天生他本身的css文件,js文件.

由因而多页运用,在这我的html都是手动建立的(还没找到什么好的解决方法),所以我们直接在我们的index页面里link和script他们

    <link rel="stylesheet" href="../../../Public/css/index/index.css">
    <script src="../../../Public/js/index/index.js"></script>

当我们须要上线的时刻在用gulp把相对途径给替换成线上途径

二、webpack

module.exports = {
    entry: {}, //路口
    output: { }, //输出出口
    module: {
        loaders: [ ]
    },
    babel: { //设置babel
        "presets": ["es2015"],
        "plugins": ["transform-runtime"]
    },
    plugins: [ ],//编译的时刻所实行的插件数组
    vue: { },//vue的设置,须要零丁出来设置
    devtool : "source-map" //调试形式
};

这很简单就不过量引见,因为我们是多页运用,我们须要编写一个函数猎取一切路口js,天生一个我们想要的途径的对象.

三、entry


//须要用到glob模块
var glob = require('glob');

var getEntry = function () {
    var entry = {};
    //起首我们先读取我们的开辟目次
    glob.sync('./source/**/*.js').forEach(function (name) {
        var n = name.slice(name.lastIndexOf('source/') + 7, name.length - 3);
        n = n.slice(0, n.lastIndexOf('/'));
        //接着我对途径字符串举行了一些裁剪成想要的途径
        entry[n] = name;
    });
    
    console.log(entry); 
    /**
    *     entry = { 
    *                'crowd/index' : './source/crowd/index/index.js',
    *                'index/index' : './source/index/index/index.js'
    *               }
    *
    **/
    //末了返回entry  给 webpack的entry
    return entry; 
};

四、output


output: { //输出位置
    path: path.resolve(__dirname, './public/'), //设置输出途径
    filename: './js/[name].js' //文件输出情势
    //关于filename 我们有个变量就是 [name] = entry的key  固然另有别的变量比方[id],[hash]等,人人能够自行发挥
    //我们也能把filename写成  filename : [name]/[name].[name].js 也是能够的
},

五、loader

关于loader,其实有两种写法


{
    test: /\.(png|jpg|gif)$/,
    loader: 'url?limit=10000&name=./images/[name].[ext]?[hash:10]',
    /*query: {
        limit: 10000,
        name: './images/[name].[ext]?[hash:8]'
    }*/
},

//在这无论是直接loader 背面跟参数(像url跟参一样),或许是背面随着一个对象 query,都是能够的.

六、 plugins

  • 这里我就只用到一个就是天生 自力的css文件,style嵌套在页面里的体式格局实在是丑得不可

七、 vue

这没啥好说的,vue更新以后须要零丁出来设置了

vue: { //vue的设置,须要零丁出来设置
    loaders: {
        js: 'babel'
    }
}

八、 NODE_ENV

  • 以上都是我们的开辟设置,在临盆环境中,我们还须要增加一些东西

  • 关于调试 在这里我也处理了异常久,假如开辟的时刻直接把vue的设置都写好,那在 页面是有题目的.所以我们得别的写一套vue,特地在临盆环境中运用


//因为我们的.vue文件模块化开辟,内里天然也有 css与sass,我们也须要设置末了导出css文件
var vueLoader = {
    js: 'babel',
    css: ExtractTextPlugin.extract("vue-style-loader", "css-loader"),
    sass: ExtractTextPlugin.extract("vue-style-loader", "css-loader", 'sass-loader')
};

if (process.env.NODE_ENV === 'production') { //推断是不是为临盆环境

    module.exports.vue.loaders = vueLoader;
    //以下直接自创尤大大的了
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: '"production"'
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new webpack.optimize.OccurenceOrderPlugin()
    ]);
} else { //不是临盆环境则设置devtool 调试
    module.exports.devtool = 'source-map';
}

九、 gulp

  • 仅仅只要webpack部份照样没法满足我们的初志,所以我们须要gulp举行辅佐

webpack仅仅只会把我们js路口里的一切东西都处理了,然则我们的页面都是我们本身手动写的(还没想到更好的解决方案)

所以我们须要借助gulp的气力,把我们的.html移入我们想要的目次

然则如许的目次构造输出实际上是有题目的


--- source (前端开辟目次)
    |--- index (一个营业需求模块,每一个营业需求模块下会有许多页面)
    |    |--- index (index 页面)
    |    |      |--- images    
    |    |    |--- index.html 
    |    |    |--- app.vue
    |    |    |--- index.js
    |    |    |--- style.scss
    |    |    |--- ...
    |    |--- topics (topics 页面)
    |    |    |--- images
    |    |    |--- topics.html
    |      |      |    ...
    |--- crowd (别的一个营业需求模块,每一个营业需求模块下会有许多页面)          
    |    |--- index 
    |    |    |--- index.html

//我们能够晓得gulp经由历程通配符 ./source/**/*.html 匹配到的文件 输入输出目次构造都是雷同的

//那我们就会取得以下毛病的输出构造

--- Application (毛病构造)
    |--- Home
    |   |--- View (线上用户接见的.html目次)
    |         |--- index (一个营业需求模块)
    |          |      |--- index (index 页面,过剩的目次)
    |         |     |     |--- index.html
    |         |     |--- topics (topics页面,过剩的目次)
    |          |     |     |--- topics.html
    |         |--- crowd (crowd营业模块)
    |         |     |--- index (crowd营业模块 index页面,过剩的目次)
    |         |     |     |--- index.html

//我们的营业模块文件应当包括一切的营业页面,而无需一个页面就是一个文件夹.
//所以以下才是准确的目次构造

--- Application (准确构造)
    |--- Home
    |   |--- View (线上用户接见的.html目次)
    |    |    |--- index (一个营业需求模块)
    |    |    |     |--- index.html
    |    |    |     |--- topics.html
    |    |    |--- crowd (另一个营业需求模块)
    |    |    |     |--- index.html                     
                     
  • 本人想了异常多种体式格局都没方法完成,末了找到了唯一的方法(异常的愚昧的方法,假如您有更好的方法贫苦告诉我 T.T)

var map = require('map-stream');
var vfs = require('vinyl-fs');

gulp.task('view', function () {

    var log = function(file, cb) { 
        //定义输出途径
        var view = __dirname + '/Application/Home/View';
        
        //又是一段切割历程 猎取我们想要的构造
        var target = file.path.split('/').splice(-3);
        var qqqq = target.splice(1, 1);
        
        //设置我们的文件输出path
        file.path = view + '/' + target.join('/'); 
        cb(null, file);
    };
    vfs.src('./source/**/*.html')
        .pipe(rev()) //这里您能够做一些pipe的操纵
        .pipe(map(log))
        .pipe(vfs.dest('./output')); //这里会多输出一次

    gulp.start(['clean']); //我们须要实行一次clean 清理了过剩的那层目次
});
  • 如许我们就可以取得我们想要的目次! 而且还能经由pipe对html文件的操纵! 最大的难点也就在这里

以上基本是我们一切的设置了,关于热加载,或许是browserSync等别的辅佐开辟东西,人人能够在这基本上自行拓展.

十、后话

年末,前端种种战役人人也都看见了.在如许一个前端需求极速增进,百花怒放,百花齐放的黄金时期.人人应当延续坚持进修的热忱

关注时期生长,张望技术生长,不自觉跟风,挑选最适合本身的,最相符现有项目的.

倘使一个东西没法为你们的项目带来更好的效力,给开辟带来更有益的生长.那你最好坚持张望,别顺从.

本人没有经历过grunt时期,然则自从进修前端自动化构建以来也是一起从 grunt -> gulp -> webpack 过渡的

在这时期完全能够相识他们之前的差别和差别,更多的应当进修头脑

你应当多诘责本身,为何这个东西当下会火呢?你应当不应当进修?

我非常不赞同那些拿来即用的同砚,说什么不久以后就死了,学也没什么用,浪费时间,我抄一个不就好了吗?

虽然我写得都很基本,但我照样愿望您别看我的文章.

  • 假如能给您带来不错的进修体验,贫苦请右上角star : ) hava a nice day

原文地点: http://www.meckodo.com/?p=525

悉数代码:https://github.com/MeCKodo/webpack

    原文作者:二哲
    原文地址: https://segmentfault.com/a/1190000004392339
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞