Aclararé mi pregunta para un caso de uso muy específico.
Digamos que he diseñado mi código de la siguiente manera:
Y este es el contenido:
src/inner/inner.darwin.ts:
export default function logger() { console.log('Darwin Logger'); }src/inner/inner.windows.ts:
export default function logger() { console.log('Windows Logger'); }src/interior/interior.ts:
TENGA EN CUENTA el valor predeterminado de exportación: es obligatorio
import LOGGER from '???????????'; export default class A { public static logger() { LOGGER(); } } Básicamente, cuando compilo el código de Windows, quiero importar el código inner.windows.ts . Cuando se usa código Mac: código inner.darwin.ts .
Sé que puedo controlar los archivos excluidos en tsconfig.json . Entonces, cuando vaya a crear una aplicación de Windows, codificaré:
"exclude": ["**/*.darwin.ts"]Y cuando voy a crear Mac uno:
"exclude": ["**/*.windows.ts"]Sin embargo, no ayudó a resolver el problema de la importación.
Sé que puedo ejecutar el código dependiendo de la plataforma subyacente usando process.platform , pero no hace el trabajo. Quiero que la aplicación de salida de Windows sea más pequeña e ignore cualquier código de Mac. Si usara este process.platform , el código de Mac seguiría existiendo en la aplicación de Windows subyacente.
¿Algún consejo?
¿Puede Webpack hacer algo para ayudar? Estoy abierto a cualquier cambio de código siempre que el código esté bien definido y dividido, y el resultado final es que solo tengo el código de Darwin y el código de Windows.
Así que la solución es bastante simple. Todo lo que tenía que hacer era usar un complemento de Webpack. El mejor complemento para adaptarse a esta tarea es NormalModuleReplacementPlugin que Webpack proporciona de forma inmediata.
La exclude en tsconfig.ts ya no es razonable dentro de esta solución.
Simplemente proporcione el siguiente complemento:
new webpack.NormalModuleReplacementPlugin( /darwin/, function (resource) { resource.request = resource.request.replace( /darwin/, 'windows', ); } ), Esto anulará cualquier importación a un archivo darwin en un archivo winodws .
Ahora, en desarrollo, existen ambos archivos, pero en compilación, solo existirá cualquiera de ellos.
inner.ts simplemente se convierte en:
import LOGGER from './inner.darwin'; export default class A { public static logger() { LOGGER(); } } Por supuesto, podría ser bastante engorroso ingresar a webpack.config.ts en cada compilación, por lo que definitivamente podríamos ejecutar un script adicional de webpack para decidir qué compilación subyacente usar, por ejemplo:
const appTarget = env.APP_TARGET || 'darwin'; Y luego simplemente use esta variable dentro del complemento y ejecute su script de compilación npm proporcionando un argumento APP_TARGET .