Je voudrais étendre la configuration webpack par défaut de ionic. Plus précisément, je voudrais ajouter un alias pour résoudre les modules afin de pouvoir importer des modules par leur chemin absolu, plutôt que relatif:
Au lieu d'importer des modules comme celui-ci:
import { SomeComponent } from '../../components/some.component.ts';
Je veux
import { SomeComponent } from '@app/components/some.component.ts';
où @app
est un alias pour le répertoire source racine.
Dans d'autres projets, j'ai pu le faire en ajoutant quelque chose comme ça à la configuration du webpack:
module.exports = {
...
resolve: {
extensions: ['.ts', '.js'],
alias: {
'@app': path.resolve('./'),
}
},
...
};
Je ne sais pas comment faire cela avec Ionic sans remplacer la configuration par défaut du webpack.
Vous souhaiterez peut-être copier le fichier webpack.config.js existant, le modifier et configurer pour l'utiliser à la place du fichier initial.
Voici les étapes
Dans le dossier racine de votre projet, créez le dossier config et copiez le fichier webpack.config.js
là (ce fichier se trouve dans ..\node_modules\@ionic\app-scripts\config
Modifiez le fichier copié selon vos besoins
Dans le fichier package.json
de votre projet, ajoutez:
"config": { "ionic_bundler": "webpack", "ionic_webpack": "./config/webpack.config.js" }
La réponse acceptée fonctionne bien mais vous devrez mettre à jour webpack.config.js
chaque fois que vous mettez à jour app-script
. Donc, au lieu de copier du code, require
dans webpack.config.js
package.json
"config": {
"ionic_webpack": "./config/webpack.config.js"
}
webpack.config.js
const webpackConfig = require('../node_modules/@ionic/app-scripts/config/webpack.config');
webpackConfig.resolve = {
extensions: ['.ts', '.js'],
alias: {
'@app': path.resolve('./'),
}
}
Dans la plupart des cas, vous pouvez suivre cette approche et vous n'aurez pas à mettre à jour config
à chaque mise à jour app-script
Mappage du chemin du module dans la version @Ionic - 3.14.0
Dans le cas où quelqu'un a du mal à trouver les changements exacts pour que cela fonctionne.
Dans ionic 3 (version 3.14.0), pour que alias mappage fonctionne, vous devrez définir le mappage de chemin à la fois dans webpack.config.js
& tsconfig.json
- package.json
Pour utiliser la configuration du webpack personnalisé, configurez votre package.json
Pour charger votre webpack.config.js
Personnalisé.
"config": {
"ionic_webpack": "./config/webpack.config.js"
}
- config/webpack.config.js
Fusionnez l'alias avec la configuration par défaut du webpack ...
const path = require('path');
const { dev, prod } = require('@ionic/app-scripts/config/webpack.config');
const webpackMerge = require('webpack-merge');
const customConfig = {
resolve: {
alias: {
'@app': path.resolve('src/app'),
'@pages': path.resolve('src/app/pages'),
'@constants': path.resolve('src/app/constants'),
'@components': path.resolve('src/app/components'),
"@shared": path.resolve('src/app/shared')
}
}
};
module.exports = {
dev: webpackMerge(dev, customConfig),
prod: webpackMerge(prod, customConfig)
};
- config/test/webpack.config.js
Fusionnez l'alias avec la configuration par défaut du webpack ...
const path = require('path');
const webpackDefault = require('@ionic/app-scripts/config/webpack.config');
const webpackMerge = require('webpack-merge');
const customConfig = {
resolve: {
alias: {
'@app': path.resolve('src/app'),
'@pages': path.resolve('src/app/pages'),
'@constants': path.resolve('src/app/constants'),
'@components': path.resolve('src/app/components'),
"@shared": path.resolve('src/app/shared')
}
}
};
module.exports = webpackMerge(webpackDefault, customConfig);
- tsconfig.json
Définissez baseUrl
& paths
dans tsconfig.json
Comme suit:
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@app/*": ["app/*"],
"@pages/*": ["app/pages/*"],
"@constants/*": ["app/constants/*"],
"@components/*": ["app/components/*"],
"@shared/*": ["app/shared/*"]
}
},
}
Réf: My ionic env info:
@ionic/cli-plugin-proxy : 1.4.13
@ionic/cli-utils : 1.14.0
ionic (Ionic CLI) : 3.14.0
cordova (Cordova CLI) : 7.1.0
@ionic/app-scripts : 2.1.4
Cordova Platforms : Android 6.2.3 ios 4.5.1
Ionic Framework : ionic-angular 3.6.0
Salut Maverick09 réponse est génial mais cela n'a pas fonctionné pour moi J'utilise cette configuration:
packages cli:
@ionic/cli-utils : 1.15.2
ionic (Ionic CLI) : 3.15.2
packages locaux:
@ionic/app-scripts : 3.0.1
Ionic Framework : ionic-angular 3.8.0
Système:
Node : v6.10.0
npm : 3.10.10
OS : Windows 10
la configuration par défaut a deux parties dev et prod donc si vous changez la configuration personnalisée comme celle-ci semble tout fonctionner
const customConfig = {
dev: {
resolve: {
alias: {
'@app': path.resolve('src/app'),
'@pages': path.resolve('src/pages'),
'@common': path.resolve('src/common'),
'@storyboards': path.resolve('src/storyboards'),
"@locale": path.resolve('src/locale')
}
}
},
prod: {
resolve: {
alias: {
'@app': path.resolve('src/app'),
'@pages': path.resolve('src/pages'),
'@common': path.resolve('src/common'),
'@storyboards': path.resolve('src/storyboards'),
"@locale": path.resolve('src/locale')
}
}
}
};
Dans les versions récentes d'ionic, l'alias ne fonctionne que si vous utilisez ce correctif (laissez le chargeur TypeScript connaître l'alias): tsconfig.json
"compilerOptions": {
...
"baseUrl": "./src",
"paths": {
"@app/config": ["config/config"]
}
}
...
crédit: https://github.com/ionic-team/ionic-app-scripts/pull/683#issuecomment-294078919
Mon ionic info:
cli packages: (/Users/.../node_modules)
@ionic/cli-plugin-cordova : 1.6.2
@ionic/cli-plugin-ionic-angular : 1.4.1
@ionic/cli-utils : 1.7.0
ionic (Ionic CLI) : 3.7.0
packages globaux:
Cordova CLI : 7.0.1
packages locaux:
@ionic/app-scripts : 2.1.3
Cordova Platforms : none
Ionic Framework : ionic-angular 3.6.0
Système:
Node : v6.9.5
OS : macOS Sierra
Xcode : Xcode 8.3.3 Build version 8E3004b
ios-deploy : 1.9.1
ios-sim : 5.0.13
npm : 5.3.0