标签: Webpack

  • babel-loader 生成多处 /******/ 前缀

    使用 babel-loader 处理 .js 文件之后会在公共文件里多处行首添加 /******/,不明白为什么要这样做。

    难道仅仅是为了区别框架代码和用户代码?

    /******/ (function(modules) { // webpackBootstrap
    /******/    // install a JSONP callback for chunk loading
    /******/    var parentJsonpFunction = window["webpackJsonp"];
    /******/    window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
    /******/        // add "moreModules" to the modules object,
    /******/        // then flag all "chunkIds" as loaded and fire callback
    /******/        var moduleId, chunkId, i = 0, callbacks = [];
    /******/        for(;i < chunkIds.length; i++) {
    /******/            chunkId = chunkIds[i];
    /******/            if(installedChunks[chunkId])
    /******/                callbacks.push.apply(callbacks, installedChunks[chunkId]);
    /******/            installedChunks[chunkId] = 0;
    /******/        }
    /******/        for(moduleId in moreModules) {
    /******/            modules[moduleId] = moreModules[moduleId];
    /******/        }
    /******/        if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
    /******/        while(callbacks.length)
    /******/            callbacks.shift().call(null, __webpack_require__);
    /******/        if(moreModules[0]) {
    /******/            installedModules[0] = 0;
    /******/            return __webpack_require__(0);
    /******/        }
    /******/    };
    

    目前应该没有参数可以控制移除,因为在文件 ./node_modules/webpack/lib/MainTemplate.js 中硬编码了这一段前缀

    this.plugin("render", function(bootstrapSource, chunk, hash, moduleTemplate, dependencyTemplates) {
        var source = new ConcatSource();
        source.add("/******/ (function(modules) { // webpackBootstrap\n");
        source.add(new PrefixSource("/******/", bootstrapSource));
        source.add("/******/ })\n");
        source.add("/************************************************************************/\n");
        source.add("/******/ (");
        var modules = this.renderChunkModules(chunk, moduleTemplate, dependencyTemplates, "/******/ ");
        source.add(this.applyPluginsWaterfall("modules", modules, chunk, hash, moduleTemplate, dependencyTemplates));
        source.add(")");
        return source;
    });
    

    babel-loader 配置参考: API · Babel

  • Webpack 打包 css,z-index 被重新计算

    使用 Webpack 打包 css 文件,发现打包后的 z-index 值跟源文件 z-index 不一致。

    如下图,左侧是源文件,右侧是打包后的文件:

    即使加上 !important,经过 OptimizeCssAssetsPlugin 调用 cssProcessor cssnano 处理之后也是 z-index: 2

    因此,很可能是 cssnano 进行了重新计算(cssnano 称为 rebase),而且这种计算是不够准确的

    因为打包后的文件有两处 z-index,这里是第二处,所以此处 z-index 是 2。

    cssnano 将 z-index rebase 归类为 unsafe,而不是 bug,只有在单个网页的 css 全部写入一个 css 文件,并且不通过 JavaScript 进行改动时是 safe。

    参考:http://cssnano.co/optimisations/zindex/

    项目中提取了公共的 css,已经对 layout 设置了很小的 z-index,因此受到 cssnano z-index rebase 的影响。

    cssnano 默认进行 z-index rebase。

    unsafe (potential bug) 优化项默认不开启应该比较友好。

    new OptimizeCssAssetsPlugin({
        cssProcessor: require('cssnano'),
        cssProcessorOptions: {
            discardComments: {removeAll: true},
            // 避免 cssnano 重新计算 z-index
            safe: true
        },
        canPrint: false
    })