【问题标题】:Dynamic import paths in Vue and WebpackVue 和 Webpack 中的动态导入路径
【发布时间】:2019-05-05 07:28:09
【问题描述】:

我正在 VueJS 2(和 Vue-CLI 3)中创建一个前端项目,它将被不同的客户端使用,我希望能够导入我需要的所有内容(JS 文件,如 mixins 和组件代码和 CSS /LESS 文件)在 webpack 构建过程中基于 CID 参数化,该 CID 将存储在: 1) Vue .env 文件或 2) webpack 配置文件中的某处或 3) 作为参数传递给npm run watchnpm run build

我搜索了很多解决方案(Webpack 插件等),但它们都不是简单或优雅的,我也不能真正理解 Webpack 的内部工作原理来实现这些解决方案,而且大多数都与动态加载有关,而不是动态构建过程。

不同的客户端需要不同的代码和样式,例如:

<template>...</template>
<script src="./component-code.js"></script>
<style src="@/styles/component-style.less"></style>

这些路径需要按照以下方式转变:

<template>...</template>
<script src="./CLIENTID/component-code.js"></script>
<style src="@/styles/CLIENTID/component-style.less"></style>

...这样 Webpack 可以在使用真实文件夹名称进行编译时替换这些 CLIENTID 引用,无论它们可能是什么。这也必须适用于任何其他文件路径(例如,当使用像 import something from "./path/CLIENTID/to/file"; 这样的语句时)。

将此类变量注入构建过程的最简单解决方案是什么?谢谢!

【问题讨论】:

  • 您最终是否使用下面提出的解决方案进行生产?我面临着类似的挑战,但没有很多真正针对客户的组件。
  • 实际上不,我实现了一个反模式,它使用 CSS 类和 JS 条件,由于我们的时间线,临时工作(导入所有项目的所有代码)但我计划重构项目以使用所选答案中概述的解决方案,其中 Webpack 将根据环境变量动态导入文件。这不是一个大项目,也不是一个高优先级的项目。但是,当我开始重构它时,我会在此处发布更多详细信息。
  • 只是对此的一个小更新 - 我最终还是继续接受了接受的答案,并重构了应用程序以在项目文件路径中使用 CLIENTID 作为别名。它对我们很有用。它不是 100% 完美的,但它非常灵活且易于设置,并且以这种方式更易于维护。在实现此目标时,推荐使用此用例的方法,而不会过多地破坏默认的 Vue 项目设置。

标签: vue.js webpack build environment-variables


【解决方案1】:

作为一种选择,可以使用别名和架构规则的组合来实现请求的功能。

1) 通过环境变量传递CLIENTID 或从任何自定义配置文件中导出它。既然提到了 CI,我们建议使用process.env

2) 为所有可用于导入的相关路径创建别名。可以在vue.config.js@vue/cli 3.0+ 的情况下)或 webpack 配置文件中完成。

上述路径示例:

'~styles': `src/styles/${process.env.CLIENTID}`
'~components': `src/components/${process.env.CLIENTID}`
'~something': `src/something/${process.env.CLIENTID}`

3) 更改项目结构以将特定于客户端的组件包含在单独的文件夹中,同时通过默认路径保持共享代码可用。

4) 使用别名,这将解析正确的路径:

import CustomButton from '~components/custom-button.vue'

如果您计划为不同的客户带来多个版本,则将项目架构重构为可以为每个 CLIENTID 拆分所有相关资产的东西可能会很有用,例如:

project |
        |-- common     |
        |              |--styles
        |              |--components
        |               
        |--CLIENTID_1  |
        |              |--styles
        |              |--components
        |
        |--CLIENTID_2  |
                       |--styles
                       |--components

这样别名会更方便事件的声明和使用:

'~common': `src/common`
'~client': `src/${process.env.CLIENTID}`  

import CommonButton from '~common/components/common-button.vue'
import CustomButton from '~client/components/custom-button.vue'

【讨论】:

  • 一个有趣的方法。然后我什至可以将代码库拆分为 Git 子模块。
  • 所以我使用了configureWebPack 并在resolve 下创建了别名。示例 here 但似乎有多种方法可以做到这一点。
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 2011-07-20
  • 2017-03-26
  • 2019-03-06
  • 2020-07-30
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多