Je travaille sur un projet qui a différentes instances d'application vuejs comme.
main-project
> app1
> src
> build
-- main.js
-- App.vue
-- package.json
> app2
> src
> build
-- main.js
-- App.vue
-- package.json
> app3
> src
> build
-- main.js
-- App.vue
-- package.json
.
.
.
.
J'ai créé ces applications à l'aide de vue-cli
: vue init webpack app1
, vue init webpack app2
etc. Lorsque je crée ces applications à l'aide de webpack
j'ai les fichiers suivants
main-project
> dist
> assets
> app1
-- app.css
-- vendor.js
-- app.js
-- manifest.js
> app2
-- app.css
-- vendor.js
-- app.js
-- manifest.js
> app3
-- app.css
-- vendor.js
-- app.js
-- manifest.js
-- app1.html
-- app2.html
-- app3.html
.
.
.
.
Il y a 3 (ou plus d'applications ..) ont différents composants, par exemple. Disons que app2 est uniquement pour mobile et qu'il a tous les composants différents de telle manière qu'ils ne sont pas utilisés (ne peuvent pas être utilisés) dans d'autres applications. Alors maintenant aussi longtemps que le no de l'application est moins nombreux cette approche semble correcte. Mais lorsqu'aucune des applications n'augmente en taille, cela créera le même type de fichier multiple comme package.json node_modules et ainsi de suite. Cela entraînera une augmentation inutile de la taille du fichier de projet.
Maintenant, ma question est de savoir comment organiser cela de telle manière que je puisse utiliser les mêmes package.json et node_modules (mêmes fichiers sur différentes applications) à partir d'un dossier unique comme:
main-project
> apps
> src
> build
-- package.json
-- main1.js
-- App1.vue
-- main2.js
-- App2.vue
-- main3.js
-- App3.vue
.
.
.
.
et après les avoir construits pour la production
main-project
> dist
> assets
> app1
-- app.css
-- vendor.js
-- app.js
-- manifest.js
> app2
-- app.css
-- vendor.js
-- app.js
-- manifest.js
> app3
-- app.css
-- vendor.js
-- app.js
-- manifest.js
-- app1.html
-- app2.html
-- app3.html
.
.
.
.
Si nous utilisons le modèle webpack
pour générer un passe-partout pour notre projet dans vue-cli
nous pouvons le faire de la manière la plus simple:
Ajoutez simplement le code suivant dans la section plugin dans webpack.prod.conf.js
fichier :
new HtmlWebpackPlugin({
filename: 'app1.html',
template: 'app1_template.html',
inject: true,
chunks: ['app1', "vendor", "manifest"],
chunksSortMode: 'dependency'
}),
new HtmlWebpackPlugin({
filename: 'app2.html',
template: 'app2_template.html',
inject: true,
chunks: ['app2', "vendor", "manifest"],
chunksSortMode: 'dependency'
}),
etc
Webpack peut spécifier plusieurs fichiers d'entrée, vous devriez donc être en mesure de conserver la structure de votre projet avec un package.json au niveau racine et Webpack peut créer chaque fichier indépendant en un seul fichier.
Exemple de Webpack
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
require('babel-loader');
module.exports = {
entry: {
App1: './App1/main.js',
App2: './App2/main.js'
},
module: {
rules: [{
test: /\.ts$/,
loader: 'ts-loader',
exclude: /node_modules|vue\/src/,
options: {
appendTsSuffixTo: [/\.vue$/]
}
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
esModule: true,
loaders: {
'js': 'babel-loader'
}
}
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
'file-loader'
]
}
]
},
resolve: {
extensions: [".ts", ".js"],
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
plugins: [
new CleanWebpackPlugin(['dist'])
, new CopyWebpackPlugin([
{ from: './App1/*.css' },
{ from: './App1/*.html' },
{ from: './App2/*.css' },
{ from: './App2/*.html' },
])
],
output: {
filename: './Apps/[name]/[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
node: {
fs: 'empty'
}
}