V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
oakland
V2EX  ›  JavaScript

请教,根据不同的客户打包不同的文件

  •  
  •   oakland · 2020-04-06 01:47:56 +08:00 · 2417 次点击
    这是一个创建于 1471 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同一个项目,需要根据不同的客户打包不同的文件内容,比如样式或者图片。还有一些页面对一些客户是隐藏的,需要在菜单和路由中打包的时候进行隐藏。

    我现在的方法是打包的时候,在命令行中添加一个 client 全局变量,然后在具体的组件中对 client 判断,然后引入不同的文件。例如:

    
    import React from 'react';
    ...
    import(client === 'xxx' ? './xxxStyle.scss' : './normalStyle.scss').then(data => styles = data);
    let styles = {};
    

    但是总觉得这样把一些逻辑判断混杂在代码中很不舒服,而且未来再有新的客户,又要添加新的判断逻辑。 不知道还有没有更好的方式?

    5 条回复    2020-04-06 09:55:07 +08:00
    noe132
        1
    noe132  
       2020-04-06 01:52:22 +08:00
    这样 import 真的不会出问题?
    webpack 在 import 不是静态字符串的时候,会把项目所有文件都当作一个单独的 module 打包成 chunk 。
    如果你的项目有 100 个文件,最后打包出来除了正常打包的 chunk,还会有额外的 100 个 chunk
    randyo
        2
    randyo  
       2020-04-06 02:01:53 +08:00 via Android
    用 if 判断吧,分开写两个 import,打包后根据 client 的值,有一个分支代码 webpack 会直接帮你删掉
    DamienS
        3
    DamienS  
       2020-04-06 02:14:36 +08:00
    我公司好像也这么用。不过是 extreact 出来。

    写个
    const comp = conditional_require('xxxx','someUIComponent.react', 'someOldComponent.react')。

    'xxxx'是个 ab testing identifier 。比如'ui_redesign_v2'
    weixiangzhe
        4
    weixiangzhe  
       2020-04-06 09:42:48 +08:00
    针对多个用户打包为多个文件?
    可以用 webpack, 已 react 项目为例

    ————————
    package.json 里加入
    ```
    "build:what_you_wanta": "cross-env DT_BUILD_ENV=what_you_wanta node scripts/build.js",
    ```


    ______
    weixiangzhe
        5
    weixiangzhe  
       2020-04-06 09:55:07 +08:00
    针对多个用户打包为多个文件?
    可以用 webpack 的 extensions 处理,类似 react-native 项目,文件有不同的打包后缀. xxx.ios.js xxx.android.js 之类的, 可以自定一下,已 react 项目为例

    ————————
    1. package.json 里加入环境变量与打包配置
    ```
    "build:WHAT_YOU_WANTA": "cross-env USER_ENV=WHAT_YOU_WANTA node scripts/build.js",
    ```
    2. 在`webpack` 下 resolve/extensions 下动态由环境变量加入配置
    https://webpack.js.org/configuration/resolve/#resolveextensions
    如,我现在用的项目是基于 create-react-app 的,extensions 在`config/paths.js` 下,所以我添加了对应配置为

    ```js
    const dynamicMap = {
    user1: ['user1.js','user1.web.js','user1.tsx']
    user2: ['user2.js','user2.web.js','user2.tsx']
    }

    const moduleFileExtensions = [
    'web.mjs',
    'mjs',
    'web.js',
    // 在线打包时加入
    ...dynamicMap[process.env.USER_ENV ] || [],
    'js',
    'web.ts',
    'ts',
    'web.tsx',
    'tsx',
    'json',
    'web.jsx',
    'jsx',
    ].filter(i=>!!i)
    ```
    _______
    3. 使用
    使用时就简单了, 书写时,默认就用 xxx.js,如果是只有 user1 要用的文件,就加一个 xxx.user1.js


    ```
    cd xxx/ && ls
    index.user1.js
    index.user2.js
    index.user3.js
    index.js
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1318 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 110ms · UTC 17:36 · PVG 01:36 · LAX 10:36 · JFK 13:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.