typescript - Hvordan importere Material Module eller NgxBootstrap i Angular Universal?
Akkurat nå prøver jeg å bygge et prosjekt ved hjelp av Angular Universal. Jeg bruker Angular 4. Hvis jeg importerer Material-modulen - kan prosjektet bygges, men når jeg kjører det gjennom ts-node, dukker det opp en feil -
dist\ngfactory\node_modules\@angular\material\typings\index.ngfactory.ts:9
import * as import0 from '@angular/core';
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:53:10)
at Object.runInThisContext (vm.js:95:10)
at Module._compile (module.js:543:28)
at Module._extensions..js (module.js:580:10)
Eller hvis jeg prøver å importere NgXBootstrap, dukker denne feilen opp -
node_modules\ngx-bootstrap\dropdown\bs-dropdown.module.js:1
(function (exports, require, module, __filename, __dirname) { import { NgModule } from '@angular/core';
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:53:10)
at Object.runInThisContext (vm.js:95:10)
at Module._compile (module.js:543:28)
at Object.Module._extensions..js (module.js:580:10)
Jeg følger denne prosjektstrukturen - https://github.com/designcourse/angular-seo
Jeg limer inn koden her -
app.modul.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
//Material Module
import {MaterialModule} from '@angular/material';
//Ngx Bootstrap
import {BsDropdownModule} from 'ngx-bootstrap';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { HeaderComponent } from './header/header.component';
import { PostsComponent } from './posts/posts.component';
@NgModule({
declarations: [
AppComponent,
HeaderComponent,
PostsComponent
],
imports: [
BrowserModule.withServerTransition({appId: 'universal-app'}),
FormsModule,
HttpModule,
AppRoutingModule,
MaterialModule,
BsDropdownModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
app.server.modul.ts
import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';
@NgModule({
imports: [
ServerModule,
AppModule
],
bootstrap: [AppComponent]
})
export class AppServerModule { }
server.ts
import 'reflect-metadata';
import 'zone.js/dist/zone-node';
import { platformServer, renderModuleFactory } from '@angular/platform-server'
import { enableProdMode } from '@angular/core'
import { AppServerModuleNgFactory } from '../dist/ngfactory/src/app/app.server.module.ngfactory'
import * as express from 'express';
import { readFileSync } from 'fs';
import { join } from 'path';
const PORT = 4000;
enableProdMode();
const app = express();
let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString();
app.engine('html', (_, options, callback) => {
const opts = { document: template, url: options.req.url };
renderModuleFactory(AppServerModuleNgFactory, opts)
.then(html => callback(null, html));
});
app.set('view engine', 'html');
app.set('views', 'src')
app.get('*.*', express.static(join(__dirname, '..', 'dist')));
app.get('*', (req, res) => {
res.render('index', { req });
});
app.listen(PORT, () => {
console.log(`listening on http://localhost:${PORT}!`);
});
Jeg antar at dette er et problem for alle tredjepartsbiblioteker i Angular Universal. Så, hvordan importerer jeg disse bibliotekene på riktig måte?
Svar #1
Jeg vil foreslå at du bruker dette seed-prosjektet ng-seed/universal i stedet for det du følger for øyeblikket.
Nå, hvis du strukturerer appen din etter ng-seed/universal, så for å bruke Material Module og BsDropdownModule, vil du ganske enkelt legge til disse linjene i client/app/app.module.ts
import {MaterialModule} from '@angular/material';
import {BsDropdownModule} from 'ngx-bootstrap';
Sørg for at du oppdaterer din package.json tilsvarende. Kjør deretter:
npm install
dev build (Universal)
npm run build:universal-dev
prod build (Universal)
npm run build:universal-prod
start the server (Angular Universal)
npm run serve
Alt burde fungere som det skal nå.
Svar #2
For øyeblikket har jeg en app som bruker MdButtonModule, MdSidenavModule og MdToolbarModule. Disse fungerer definitivt, og trikset var å importere hammerjs i src/main.ts
