用于 ie9+ 的 vue webpack 2 自动前缀

Posted

技术标签:

【中文标题】用于 ie9+ 的 vue webpack 2 自动前缀【英文标题】:vue webpack 2 autoprefixer for ie9+ 【发布时间】:2017-12-25 18:22:36 【问题描述】:

在 webpack 构建中使用从 Vuecli 生成的 Vue。有很多魔法在发生。我想不通的是如何生成 IE 所需的供应商前缀。

这是从 github 问题中复制的:https://github.com/vuejs-templates/webpack/issues/421#issuecomment-284322065

vue-loader.conf.js

var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
 
module.exports = 
  loaders: utils.cssLoaders(
    sourceMap: isProduction
      ? config.build.productionSourceMap
      : config.dev.cssSourceMap,
    extract: isProduction
  ),
  postcss: [
    require('postcss-import')(),
    require('autoprefixer')(
      browsers: ['ie >= 9']
    )
  ]

简单的容器组件示例

容器/index.vue

<template>
    <div class="container">
        <slot></slot>
    </div>
</template>
<script>
    import './index.scss'
    export default 
</script>

容器/index.scss

// this is aliased in webpack.base.conf
@import "~styles/base-config";

.container 
  @include grid(); // this generates display:flex and border-box resets
  max-width: 100%;
  margin: 0 auto;

head 中生成的预期 inline 输出,(但目前没有得到 -ms-flexbox 或 -webkit- 前缀)

<style> 
.container 
   -webkit-box-sizing: border-box; // not generated
   box-sizing: border-box; 
   display: -webkit-box;  // not generated
   display: -ms-flexbox; // not generated
   display: flex;
   max-width: 100%;
   margin: 0 auto;

</style>

相关:

    webpack2 vue-cli autoprefixer not work in js file when require scss file?

    https://github.com/vuejs/vue-cli/issues/350 只是在 vue-loader.conf.js 中使用了最后两个版本的 autoprefixer(我使用了browsers: ['ie &gt;= 9'],没有用)

    可能的解决方案:https://github.com/vuejs-templates/webpack/issues/600 但是在控制台中出现源映射错误。

添加到 build/utils.js

// npm install postcss-loader first then edit:
...
  var postcssLoader = 
    loader : 'postcss-loader'
  

  // generate loader string to be used with extract text plugin
  function generateLoaders (loader, loaderOptions) 
    var loaders = [cssLoader, postcssLoader]
    if (loader) 
      loaders.push(
        loader: loader + '-loader',
        options: Object.assign(, loaderOptions, 
          sourceMap: options.sourceMap
        )
      )
    
...

2017 年 7 月 26 日更新

在此处添加回购:https://github.com/sidouglas/vue-js-vendor-prefixes-bug

2017 年 3 月 8 日更新

@克里斯·卡马拉塔

npm ERR! fetch failed http://remote-server/artifactory/api/npm/npm-aggregator/vue/-/vue-2.4.2.tgz
npm WARN retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND uscavs-repo1 remote-server
npm ERR! fetch failed http://remote-server/artifactory/api/npm/npm-aggregator/vue-router/-/vue-router-2.7.0.tgz
npm WARN retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND uscavs-repo1 remote-server
cloneCurrentTree: WARN retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND uscavs-repo1 remote-server
[2]  + 56232 suspended  npm i

【问题讨论】:

【参考方案1】:

我将采取一些不同的策略。 Vue/Webpack 模板的来源是here。它看起来与您在上面发布的内容完全不同。在模板的配置中,您唯一需要做的就是“使用 package.json 中的“browserslist”字段”(参考 .postcs-s-rc.js)。

作为一个实验,尝试:

    将 vue-loader.conf.js 替换为 this one 将 build/utils.js 替换为 this one 确保您在项目的根目录中有一个 .postcs-s-rc.js(在 package.json 旁边)。复制this one。 在您的 package.json 中添加 browserlist 部分。再次, sample here

有关 BrowserList 规则的信息,look here

【讨论】:

我更新了vue-cli的版本。我复制了您的文件编辑。我在根目录中有.postcs-s-rc.js。我在 package.json 中添加了 browserlist 规则 ie 9。 css输出没有变化。在相关的第 3 步(参见原始问题)中,用户 @KagamiChan 使用 post-cssloader 编辑了 utils.js。 确实 有效果,但会触发各种 css 映射错误。仍停留在这个阶段。 我可以确认开箱即用的 webpack cli 规则将遵守 package.json 中的规则,而无需修改 utils.js。这里可能有其他问题。你有 github 上的示例设置我们可以看看吗? 根据问题:我正在按照import './index.scss' 加载样式。供应商前缀 do work 在 vue 样式标签中。很快添加了回购。 想知道,如果我应该重构我的整个项目以“vue 方式”来完成它。可以只在 我使用模板默认值和您的默认值构建。差异在这里:shareitdammit.com/37r4RdXi。这就是你所期待的对吗?如果是这样,也许这是一个环境问题。您使用的是哪个版本的 Node/NPM?我在 6.10.3 / 3.10.10 参考。

以上是关于用于 ie9+ 的 vue webpack 2 自动前缀的主要内容,如果未能解决你的问题,请参考以下文章

webpack使用vue-moment-libs 在PC微信浏览器下显示空白

webpack 配置scssless全局样式(自定义的,vue-cli2/3)

vue3+webpack项目搭建实验

通过 Bootstrap-Vue + Webpack + Vue.js 使用自定义 SCSS

组件的 vue.js 自定义 css(没有 webpack 和 vue-loader)

Vuevue-cli,WebPack,vue-router路由