如何在 Vue 3.0 中通过 Webpack 使用 Bundler Build Feature Flags?

Posted

技术标签:

【中文标题】如何在 Vue 3.0 中通过 Webpack 使用 Bundler Build Feature Flags?【英文标题】:How use Bundler Build Feature Flags in Vue 3.0 with Webpack? 【发布时间】:2021-01-12 18:54:00 【问题描述】:

Vue 3.0(现已稳定)有一个未记录的功能 Bundler Build Feature Flags:

从 3.0.0-rc.3 开始,esm-bundler 构建现在公开全局 可以在编译时覆盖的功能标志:

VUE_OPTIONS_API(启用/禁用选项 API 支持,默认:true)

VUE_PROD_DEVTOOLS(在生产环境中启用/禁用 devtools 支持,默认值:false)

构建将在不配置这些标志的情况下工作, 但是强烈建议按顺序正确配置它们 在最终捆绑包中进行适当的摇树。要配置这些 标志:

webpack:使用 DefinePlugin

汇总:使用@rollup/plugin-replace

Vite:默认配置,但可以使用define选项覆盖

注意:替换值必须是布尔字面量,不能是 字符串,否则捆绑器/压缩器将无法正确 评估条件。

如何使用 vue.config.js 和 Webpack 实际配置此构建标志?

尝试过这种方式,但它似乎不会影响供应商捆绑包的大小,或者它是否应该仅适用于生产版本(目前无法尝试,因为有一个 vue-loader 错误破坏了我的产品版本)?

const webpack = require('webpack');

module.exports = 
  configureWebpack: 
    plugins: [
      // Define Bundler Build Feature Flags
      new webpack.DefinePlugin(
        // Drop Options API from bundle
        __VUE_OPTIONS_API__: false,
      ),
    ,
  ,
;

【问题讨论】:

【参考方案1】:

你写的几乎是正确的。只需删除 configureWebpack 键并像任何其他插件一样定义它。

const webpack = require('webpack');

module.exports = 
  plugins: [
    // Define Bundler Build Feature Flags
    new webpack.DefinePlugin(
      // Drop Options API from bundle
      __VUE_OPTIONS_API__: false,
    ),
  ],
;

【讨论】:

OP提供vue.config.js,使用configureWebpack 正如@tony19 提到的,vue.config.js includes configureWebpack 但不是plugins configureWebpack 不是 vue-cli 的东西吗?那么直接提供plugins 将是非cli 配置文件的方法吗? cli.vuejs.org/guide/webpack.html如果我错了请纠正我 @redfox05 是的,在 Vue CLI 脚手架项目之外,您将使用 Webpack 配置文件(例如,webpack.config.js),但 OP 表明他们正在使用 vue.config.js,它有它自己的 API 来配置底层的 Webpack 构建。 configureWebpack 选项直接传递给webpack,因此plugins: [/*...*/] 将位于该键下。 OP 似乎正确使用了该选项。 @tony19 是的,谢谢,我也是这个意思。我不太清楚,但我基本上是说这些 cmets 的答案是错误的,因为它与非 webpack 有关,而不是 OP 需要的。【参考方案2】:

您可以在此文件中获取信息:node_modules/@vue/cli-service/lib/config/base.js

  // feature flags <http://link.vuejs.org/feature-flags>
  webpackConfig
    .plugin('feature-flags')
      .use(require('webpack').DefinePlugin, [
        __VUE_OPTIONS_API__: 'true',
        __VUE_PROD_DEVTOOLS__: 'false'
      ])

所以像这样配置vue.config.js

module.exports = 
 chainWebpack: config =>
   config.plugin('feature-flags').tap(args => 
     args[0].__VUE_OPTIONS_API__ = JSON.stringify(false)
     return args
   )

或者:

chainWebpack: config =>
  config
    .plugin('feature-flags')
    .use(require('webpack').DefinePlugin, [
      __VUE_OPTIONS_API__: 'true',
      __VUE_PROD_DEVTOOLS__: 'false'
    ])

【讨论】:

以上是关于如何在 Vue 3.0 中通过 Webpack 使用 Bundler Build Feature Flags?的主要内容,如果未能解决你的问题,请参考以下文章

Vue项目中通过webpack引入zepto.js

Vue项目中通过CDN引入文件并使用

在 vue-cli 3.0 如何生成完整的 webpack.config.js

在vue-cli3.0中配置webpack

Vue中通过v-for动态添加图片地址

如何在 Vue2 中通过 HTML 运行组件的方法