2017-08-20 1 views
5

Difficulté à essayer de faire fonctionner Angular Material, ou tout autre jeu de contrôle tiers, avec ce nouveau modèle. Dans ce nouveau modèle, le webpack est divisé en TreeShakable et NonTreeShakable. De plus, le fichier app.module est maintenant app.module.shared, app.module.browser, app.module.server..Modèle .Net Core 2 Spa avec matériau angulaire

Comme j'ai essayé de faire fonctionner ceci, l'application fonctionnera uniquement avec les modules configurés dans app.module.browser, mais les étiquettes de matériaux ne seront pas traitées. Essayer quelque chose de simple et essayer le bouton. Je ne reçois aucune erreur mais ne fonctionne pas. Je suis allé à leur exemple dans Plunker, copié ce qu'il a généré, et il affiche juste en me disant que j'ai eu le css dans le droit, au moins.

Y compris la configuration du fournisseur de webpack comme point de départ, car cela semble être la clé car elle regroupe les css et js.

TIA

Webpack.vendor 
const path = require('path'); 
const webpack = require('webpack'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 
const merge = require('webpack-merge'); 
const treeShakableModules = [ 
    '@angular/animations', 
    '@angular/common', 
    '@angular/compiler', 
    '@angular/core', 
    '@angular/forms', 
    '@angular/http', 
    '@angular/platform-browser', 
    '@angular/platform-browser-dynamic', 
    '@angular/router', 
    '@angular/material', 
    '@angular/cdk', 
    'zone.js' 

]; 
const nonTreeShakableModules = [ 
    'bootstrap', 
    'jqwidgets-framework', 
    "@angular/material/prebuilt-themes/indigo-pink.css", 
    'bootstrap/dist/css/bootstrap.css', 
    'font-awesome/css/font-awesome.css', 
    'es6-promise', 
    'es6-shim', 
    'event-source-polyfill', 
    'jquery', 
]; 
const allModules = treeShakableModules.concat(nonTreeShakableModules); 

module.exports = (env) => { 
    const extractCSS = new ExtractTextPlugin('vendor.css'); 
    const isDevBuild = !(env && env.prod); 
    const sharedConfig = { 
     stats: { modules: false }, 
     resolve: { extensions: [ '.js' ] }, 
     module: { 
      rules: [ 
       { test: /\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, use: 'url-loader?limit=100000' } 
      ] 
     }, 
     output: { 
      publicPath: 'dist/', 
      filename: '[name].js', 
      library: '[name]_[hash]' 
     }, 
     plugins: [ 
      new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' }), // Maps these identifiers to the jQuery package (because Bootstrap expects it to be a global variable) 
      new webpack.ContextReplacementPlugin(/\@angular\b.*\b(bundles|linker)/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/11580 
      new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/14898 
      new webpack.IgnorePlugin(/^vertx$/) // Workaround for https://github.com/stefanpenner/es6-promise/issues/100 
     ] 
    }; 

    const clientBundleConfig = merge(sharedConfig, { 
     entry: { 
      // To keep development builds fast, include all vendor dependencies in the vendor bundle. 
      // But for production builds, leave the tree-shakable ones out so the AOT compiler can produce a smaller bundle. 
      vendor: isDevBuild ? allModules : nonTreeShakableModules 
     }, 
     output: { path: path.join(__dirname, 'wwwroot', 'dist') }, 
     module: { 
      rules: [ 
       { test: /\.css(\?|$)/, use: extractCSS.extract({ use: isDevBuild ? 'css-loader' : 'css-loader?minimize' }) } 
      ] 
     }, 
     plugins: [ 
      extractCSS, 
      new webpack.DllPlugin({ 
       path: path.join(__dirname, 'wwwroot', 'dist', '[name]-manifest.json'), 
       name: '[name]_[hash]' 
      }) 
     ].concat(isDevBuild ? [] : [ 
      new webpack.optimize.UglifyJsPlugin() 
     ]) 
    }); 

    const serverBundleConfig = merge(sharedConfig, { 
     target: 'node', 
     resolve: { mainFields: ['main'] }, 
     entry: { vendor: allModules.concat(['aspnet-prerendering']) }, 
     output: { 
      path: path.join(__dirname, 'ClientApp', 'dist'), 
      libraryTarget: 'commonjs2', 
     }, 
     module: { 
      rules: [ { test: /\.css(\?|$)/, use: ['to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize' ] } ] 
     }, 
     plugins: [ 
      new webpack.DllPlugin({ 
       path: path.join(__dirname, 'ClientApp', 'dist', '[name]-manifest.json'), 
       name: '[name]_[hash]' 
      }) 
     ] 
    }); 

    return [clientBundleConfig, serverBundleConfig]; 
} 
+0

avez-vous déjà eu ce travail? Avez-vous un modèle de base dont je pourrais tricher? –

Répondre

6

Vous devez inclure du matériel angulaire et CDK dans nonTreeShakableModules comme:

const treeShakableModules = [ 
    '@angular/animations', 
    '@angular/common', 
    '@angular/compiler', 
    '@angular/core', 
    '@angular/forms', 
    '@angular/http', 
    '@angular/platform-browser', 
    '@angular/platform-browser-dynamic', 
    '@angular/router', 
    'zone.js', 
]; 
const nonTreeShakableModules = [ 
    'bootstrap', 
    'bootstrap/dist/css/bootstrap.css', 
    '@angular/material', 
    '@angular/material/prebuilt-themes/indigo-pink.css', 
    '@angular/cdk', 
    'es6-promise', 
    'es6-shim', 
    'event-source-polyfill', 
    'jquery', 
]; 

Assurez-vous que vous avez installé les deux matériaux angulaires et des modules CDK de NPM avec les éléments suivants 2 commandes (le module d'animations est facultatif):

npm install --save @angular/material @angular/cdk 
npm install --save @angular/animations 

Cela devrait ajouter les lignes suivantes dans package.json:

"@angular/animations": "https://registry.npmjs.org/@angular/animations/-/animations-4.2.5.tgz", 
"@angular/cdk": "^2.0.0-beta.8", 
"@angular/material": "^2.0.0-beta.8", 

Vous devriez maintenant essayer d'exécuter construire webpack avec la commande suivante dans cmd ou PowerShell:

webpack --config webpack.config.vendor.js 

S'il n'y a pas d'erreurs vous peut inclure les composants que vous souhaitez utiliser dans app.module.shared.ts:

// angular material modules 
import { 
    MdAutocompleteModule, 
    MdButtonModule, 
    MdButtonToggleModule, 
    MdCardModule, 
    MdCheckboxModule, 
    MdChipsModule, 
    MdCoreModule, 
    MdDatepickerModule, 
    MdDialogModule, 
    MdExpansionModule, 
    MdGridListModule, 
    MdIconModule, 
    MdInputModule, 
    MdListModule, 
    MdMenuModule, 
    MdNativeDateModule, 
    MdPaginatorModule, 
    MdProgressBarModule, 
    MdProgressSpinnerModule, 
    MdRadioModule, 
    MdRippleModule, 
    MdSelectModule, 
    MdSidenavModule, 
    MdSliderModule, 
    MdSlideToggleModule, 
    MdSnackBarModule, 
    MdSortModule, 
    MdTableModule, 
    MdTabsModule, 
    MdToolbarModule, 
    MdTooltipModule, 
} from '@angular/material'; 
import { CdkTableModule } from '@angular/cdk'; 

et ajoutez-les aux importations dans @NgModule

Certains composants sont encore buggés jusqu'à la prochaine correction. Comme le composant case à cocher qui casse le rendu côté serveur lorsque vous actualisez la page. Mais il sera corrigé dans la prochaine version (il a déjà été sur la branche master).