{"id":39440,"date":"2023-02-13T18:28:56","date_gmt":"2022-12-26T04:26:55","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/"},"modified":"2024-04-29T14:29:10","modified_gmt":"2024-04-29T06:29:10","slug":"angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/","title":{"rendered":"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316"},"content":{"rendered":"<h1>Angular8\uff1a\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u5b9e\u73b0\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u3002<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/1-0.png\" alt=\"image.png\" \/><\/div>\n<h3>\u73af\u5883<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>ng <span class=\"nt\">--version<\/span>\r\n\r\n     _                      _                 ____ _     ___\r\n    \/ <span class=\"se\">\\ <\/span>  _ __   __ _ _   _| | __ _ _ __     \/ ___| |   |_ _|\r\n   \/ \u25b3 <span class=\"se\">\\ <\/span>| <span class=\"s1\">'_ \\ \/ _` | | | | |\/ _` | '<\/span>__|   | |   | |    | |\r\n  \/ ___ <span class=\"se\">\\|<\/span> | | | <span class=\"o\">(<\/span>_| | |_| | | <span class=\"o\">(<\/span>_| | |      | |___| |___ | |\r\n \/_\/   <span class=\"se\">\\_\\_<\/span>| |_|<span class=\"se\">\\_<\/span>_, |<span class=\"se\">\\_<\/span>_,_|_|<span class=\"se\">\\_<\/span>_,_|_|       <span class=\"se\">\\_<\/span>___|_____|___|\r\n                |___\/\r\n\r\n\r\nAngular CLI: 8.3.18\r\nNode: 10.15.3\r\nOS: win32 x64\r\nAngular: 8.2.13\r\n... animations, common, compiler, compiler-cli, core, forms\r\n... language-service, platform-browser, platform-browser-dynamic\r\n... router, service-worker\r\n\r\nPackage                                    Version\r\n<span class=\"nt\">--------------------------------------------------------------------<\/span>\r\n@angular-devkit\/architect                  0.803.18\r\n@angular-devkit\/build-angular              0.803.18\r\n@angular-devkit\/build-optimizer            0.803.18\r\n@angular-devkit\/build-webpack              0.803.18\r\n@angular-devkit\/core                       8.3.18\r\n@angular-devkit\/schematics                 8.3.18\r\n@angular\/cdk                               8.2.3\r\n@angular\/cli                               8.3.18\r\n@angular\/fire                              5.2.3\r\n@angular\/flex-layout                       8.0.0-beta.27\r\n@angular\/material                          8.2.3\r\n@angular\/platform-server                   8.2.14\r\n@angular\/pwa                               0.803.18\r\n@ngtools\/webpack                           8.3.18\r\n@nguniversal\/express-engine                8.1.1\r\n@nguniversal\/module-map-ngfactory-loader   8.1.1\r\n@schematics\/angular                        8.3.18\r\n@schematics\/update                         0.803.18\r\nrxjs                                       6.5.3\r\ntypescript                                 3.5.3\r\nwebpack                                    4.39.2\r\n<\/code><\/pre>\n<h3>\u8c03\u67e5\u548c\u51c6\u5907\u5de5\u4f5c<\/h3>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u3055\u307e\u3056\u307e\u306a\u30c6\u30b9\u30c8\u3068\u8abf\u67fb\u306e\u7d50\u679c\u3001firebaseui\u3068algolia\u306fUniversal\u3068\u306e\u30b3\u30f3\u30d1\u30c1\u304c\u30e4\u30d0\u305d\u3046\u306a\u306e\u3067\u305d\u308c\u3089\u306e\u6a5f\u80fd\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306f\u5225\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u79fb\u3057\u305f\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3067\u304d\u308b\u3088\u3046\u306bGit\u3067\u306e\u7ba1\u7406\u306f\u5fc5\u9808\u3002\u30ed\u30fc\u30eb\u30d0\u30c3\u30afGit\u30b3\u30de\u30f3\u30c9\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>git log \/\/\u623b\u3059\u5bfe\u8c61\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8abf\u3079\u308b\r\ncommit <span class=\"k\">************************<\/span>\r\n\r\n<span class=\"nv\">$ <\/span>git reset <span class=\"nt\">--hard<\/span> \u30cf\u30c3\u30b7\u30e5\u5024\r\n<\/code><\/pre>\n<h2>\u901a\u7528\u63a8\u51fa<\/h2>\n<h3>\u5b89\u88c5<\/h3>\n<p>\u547d\u4ee4\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code>$ ng add @nguniversal\/express-engine --clientProject &lt;\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d&gt;\r\n<\/code><\/pre>\n<p>\u8fd0\u884c\u540e\uff0c\u4f1a\u6dfb\u52a0\u4ee5\u4e0b\u6587\u4ef6\uff1a<br \/>\nsrc\/main.server.ts<br \/>\nsrc\/app\/app.server.module.ts<br \/>\ntsconfig.server.json<br \/>\nwebpack.server.config.js<br \/>\nserver.ts<\/p>\n<p>server.ts \u662f\u5728 Cloud Functions \u4e0a\u6267\u884c\u7684 Node Express \u670d\u52a1\u5668\u7684\u7a0b\u5e8f\u3002<\/p>\n<p>\u65e2\u5b58\u5728\u7684\u4e00\u4e9b\u6587\u4ef6\u4e5f\u5c06\u88ab\u66f4\u65b0\u3002<br \/>\npackage.json<br \/>\nangular.json<br \/>\nsrc\/main.ts<br \/>\nsrc\/app\/app.module.ts<\/p>\n<p>\u5982\u679c\u4ee5\u4e0a\u7684\u64cd\u4f5c\u6210\u529f\u4f7f\u7528build:ssr\u8fdb\u884c\u6784\u5efa\uff0c\u7136\u540e\u4f7f\u7528serve:ssr\u542f\u52a8\u670d\u52a1\u5668\uff0c\u5373\u53ef\u5b9e\u73b0SSR\u670d\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>npm run build:ssr\r\n<span class=\"nv\">$ <\/span>npm run serve:ssr\r\n\r\n<span class=\"o\">&gt;<\/span> angular-universal-functions@0.0.0 serve:ssr .\/projectName\r\n<span class=\"o\">&gt;<\/span> node dist\/server\r\n\r\nNode Express server listening on http:\/\/localhost:4000\r\n<\/code><\/pre>\n<p>\u7136\u800c\u5b9e\u9645\u4e0a\u9700\u8981\u4fee\u6539\u51e0\u4e2a\u6587\u4ef6\u3002<\/p>\n<h2>\u8bf7\u4fee\u6b63\u8fd9\u4e2a\u5730\u65b9\u3002<\/h2>\n<h3>\u65e0\u6cd5\u540c\u65f6\u4f7f\u7528Universal\u548cIvy\u3002<\/h3>\n<p>\u8fd0\u884c&#8221;npm run build:ssr&#8221;\u65f6\u51fa\u9519\uff1a<\/p>\n<p>\u5728Node\u4e2d\u53d1\u751f\u9519\u8bef\uff0cC:\/ProjectName\/node_modules\/@nguniversal\/express-engine\u4e0d\u5b58\u5728\u3002<\/p>\n<p>\u7531\u4e8e\u4f3c\u4e4e\u65e0\u6cd5\u540c\u65f6\u4f7f\u7528Universal\u548cIvy\uff0c\u6240\u4ee5\u8981\u5c06Ivy\u7981\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/tsconfig.app.json<\/span>\r\n<span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">extends<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/tsconfig.json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">outDir<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/out-tsc\/app<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">types<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[]<\/span>\r\n  <span class=\"p\">},<\/span>\r\n\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">angularCompilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">enableIvy<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span>      <span class=\"c1\">\/\/&lt;-- false\u306b<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">exclude<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">test.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">**\/*.spec.ts<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/tsconfig.spec.json<\/span>\r\n<span class=\"p\">{<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">extends<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/tsconfig.json<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">compilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">outDir<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/out-tsc\/spec<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">types<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">jasmine<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"dl\">\"<\/span><span class=\"s2\">node<\/span><span class=\"dl\">\"<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">angularCompilerOptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">enableIvy<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span> <span class=\"c1\">\/\/&lt;--false\u306b<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">files<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">test.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">polyfills.ts<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">],<\/span>\r\n  <span class=\"dl\">\"<\/span><span class=\"s2\">include<\/span><span class=\"dl\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">**\/*.spec.ts<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"dl\">\"<\/span><span class=\"s2\">**\/*.d.ts<\/span><span class=\"dl\">\"<\/span>\r\n  <span class=\"p\">]<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4e3b\u8981\u7684\u8def\u5f84\u5bf9main.server.ts\u662f\u9519\u8bef\u7684\u3002<\/h3>\n<p>\u6267\u884cnpm run build:ssr\u65f6\u51fa\u73b0\u9519\u8bef\uff1a<br \/>\nERROR in error TS6053: \u627e\u4e0d\u5230\u6587\u4ef6&#8217;C:\/\u9879\u76ee\u540d\/src\/src\/main.server.ts&#8217;\u3002<\/p>\n<p>\u56e0\u4e3a\u6ca1\u6709src\/src\/..\u8fd9\u6837\u7684\u6587\u4ef6\u5939\uff0c\u6240\u4ee5\u53ef\u80fd\u662f\u6784\u5efa\u811a\u672c\u9519\u8bef\u5730\u5f15\u7528\u4e86main.server.ts\u7684\u8def\u5f84\u63cf\u8ff0\u3002\u5728\u67d0\u4e2a\u914d\u7f6e\u6587\u4ef6\u4e2d\u627e\u5230\u4e86tsconfig.server.json\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"err\">\/\/tsconfig.server.json<\/span>\r\n<span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"extends\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\".\/tsconfig.app.json\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"compilerOptions\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"outDir\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"..\/out-tsc\/app-server\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"module\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"commonjs\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"nl\">\"files\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n    <span class=\"s2\">\"src\/main.server.ts\"<\/span> <span class=\"err\">\/\/&lt;--<\/span> <span class=\"err\">src\/\u3092\u524a\u9664\u3001<\/span><span class=\"s2\">\"main.server.ts\"<\/span><span class=\"err\">\u3068\u3059\u308b\u3002<\/span>\r\n  <span class=\"p\">],<\/span>\r\n  <span class=\"nl\">\"angularCompilerOptions\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"entryModule\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\".\/app\/app.server.module#AppServerModule\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5728SafePipe\u7c7b\u4e2d\u6dfb\u52a0\u5c5e\u6027<\/h3>\n<p>\u5728\u8fd0\u884c npm run build:ssr \u65f6\u51fa\u73b0\u9519\u8bef\uff1a<br \/>\nERROR in C:\\ProjectName\\src\\app\\service\\safe.pipe.spec.ts<br \/>\n[tsl] ERROR in C:\\ProjectName\\src\\app\\service\\safe.pipe.spec.ts(5,18)<br \/>\nTS2554\uff1a\u9884\u671f 1 \u4e2a\u53c2\u6570\uff0c\u4f46\u6ca1\u6709\u63d0\u4f9b\u3002<\/p>\n<p>\u53ea\u6709\u5728\u4f7f\u7528SafePipe\u7684\u60c5\u51b5\u4e0b\u3002<br \/>\n\u5728\u201cconst pipe = new SafePipe();\u201d\u7684\u8bed\u6cd5\u4e2d\u4f1a\u51fa\u73b0\u201cAttribute\u4e0d\u53ef\u7528\u201d\u7684\u9519\u8bef\u3002\u8bf7\u5c06\u5176\u66f4\u6539\u4e3a\u201cnew SafePipe(null)\u201d\u6765\u89e3\u51b3\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/safe.pipe.spec.ts<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SafePipe<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/safe.pipe<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">describe<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">SafePipe<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">it<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">create an instance<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">pipe<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">SafePipe<\/span><span class=\"p\">();<\/span>  <span class=\"c1\">\/\/&lt;--\u5c5e\u6027\u306bnull\u3092\u5165\u308c\u3066SafePipe(null)\u3068\u3057\u3066\u304a\u304f<\/span>\r\n    <span class=\"nx\">expect<\/span><span class=\"p\">(<\/span><span class=\"nx\">pipe<\/span><span class=\"p\">).<\/span><span class=\"nx\">toBeTruthy<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<h3>\u5728\/dist\/server\u4e2d\u627e\u4e0d\u5230package.json\u6587\u4ef6\u7684\u9519\u8bef\u3002<\/h3>\n<p>\u8fd0\u884c npm run serve:ssr \u65f6\u51fa\u73b0\u9519\u8bef<br \/>\nmain.js:165011<br \/>\n\u629b\u51fa\u4e00\u4e2a\u9519\u8bef\uff1a&#8221;package.json \u4e0d\u5b58\u5728\u4e8e &#8221; + package_json_path\u3002<\/p>\n<p>\u786e\u8ba4\u540e\uff0c\u786e\u5b9e\u5728\u6784\u5efa\u76ee\u5f55dist\/server\u4e2d\u6ca1\u6709package.json\u3002<\/p>\n<p>\u4e0d\u5927\u6e05\u695a\uff0c\u4f46\u662f\u6211\u8ba4\u4e3a\u662f\u6307package.json\u7684\u95ee\u9898\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nl\">\"build:client-and-server-bundles\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"ng build --prod &amp;&amp; ng run benzoinfojapan:server:production --bundleDependencies all\"<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u4e2d\u6587\u4e2d\u7ed9\u51fa\u4ee5\u4e0b\u53e5\u5b50\u7684\u672c\u5730\u5316\u91ca\u4e49\uff0c\u53ea\u9700\u8981\u4e00\u79cd\u9009\u9879\uff1a<br \/>\n\u3092<\/p>\n<pre class=\"post-pre\"><code><span class=\"nl\">\"build:client-and-server-bundles\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"ng build --prod &amp;&amp; ng run benzoinfojapan:server:production --bundleDependencies none\"<\/span>\r\n<\/code><\/pre>\n<p>\u5c06 &#8220;&#8211;bundleDependencies all&#8221; \u6539\u4e3a &#8220;&#8211;bundleDependencies none&#8221;\u3002<\/p>\n<p>\u7136\u540e\u91cd\u65b0\u8fd0\u884cnpm run build:ssr\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>npm run build:ssr\r\nGenerating ES5 bundles <span class=\"k\">for <\/span>differential loading...\r\nES5 bundle generation complete.\r\n\r\n<span class=\"nv\">$ <\/span>Angular_Projects@0.0.0 compile:server Angular_Projects\r\n<span class=\"nv\">$ <\/span>webpack <span class=\"nt\">--config<\/span> webpack.server.config.js <span class=\"nt\">--progress<\/span> <span class=\"nt\">--colors<\/span>\r\n\r\nHash: adsfadfadsfsdafadsf\r\nVersion: webpack 4.39.2\r\nTime: 29389ms\r\nBuilt at: 2019-12-22 16:02:13\r\n    Asset     Size  Chunks             Chunk Names\r\nserver.js  958 KiB       0  <span class=\"o\">[<\/span>emitted]  server\r\nEntrypoint server <span class=\"o\">=<\/span> server.js\r\n  <span class=\"o\">[<\/span>0] .\/server.ts 1.99 KiB <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n  <span class=\"o\">[<\/span>2] external <span class=\"s2\">\"events\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n  <span class=\"o\">[<\/span>3] external <span class=\"s2\">\"fs\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n  <span class=\"o\">[<\/span>4] external <span class=\"s2\">\"timers\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>optional] <span class=\"o\">[<\/span>built]\r\n  <span class=\"o\">[<\/span>5] external <span class=\"s2\">\"crypto\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>13] external <span class=\"s2\">\"path\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>22] external <span class=\"s2\">\"util\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>30] external <span class=\"s2\">\"net\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>35] external <span class=\"s2\">\"buffer\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>56] external <span class=\"s2\">\"stream\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>75] external <span class=\"s2\">\"querystring\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>82] external <span class=\"s2\">\"url\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>89] external <span class=\"s2\">\"http\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n <span class=\"o\">[<\/span>94] .\/src <span class=\"nb\">sync <\/span>160 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n<span class=\"o\">[<\/span>121] external <span class=\"s2\">\"require(<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">.\/server\/main<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">)\"<\/span> 42 bytes <span class=\"o\">{<\/span>0<span class=\"o\">}<\/span> <span class=\"o\">[<\/span>built]\r\n    + 107 hidden modules\r\n\r\n<span class=\"nv\">$ <\/span>npm run serve:ssr\r\n\r\n<span class=\"nv\">$ <\/span>Angular_Projects@0.0.0 serve:ssr \r\n.\/Angular_Projects\r\n\r\n\r\n<span class=\"o\">&gt;<\/span> node dist\/server\r\n\r\nNode Express server listening on http:\/\/localhost:4000\r\n<\/code><\/pre>\n<h3>\u8bf7\u8bbf\u95eehttp:\/\/localhost:4000<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/43-0.png\" alt=\"\u7121\u984c.png\" \/><\/div>\n<p>\u7531\u4e8eFirestore\u548cFireauth\u80fd\u591f\u6b63\u5e38\u5de5\u4f5c\uff0c\u6240\u4ee5\u5f88\u597d\u3002\u5373\u4f7f\u6d4f\u89c8\u5668\u7684JavaScript\u88ab\u5173\u95ed\uff0c\u4e5f\u53ef\u4ee5\u8fdb\u884c\u6d4f\u89c8\u3002<\/p>\n<h2>\u51c6\u5907\u5c06\u5e94\u7528\u90e8\u7f72\u5230Firebase<\/h2>\n<p>\u6309\u7167Firebase\u4e0a\u7684\u6307\u793a\u90e8\u7f72Angular 8 Universal\uff08SSR\uff09\u5e94\u7528\u7a0b\u5e8f\u5373\u53ef\u3002<\/p>\n<h3>\u5b89\u88c5Firebase\u5de5\u5177<\/h3>\n<pre class=\"post-pre\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> firebase-tools\r\n<\/code><\/pre>\n<h3>\u5728\u4e2d\u6587\u4e2d\uff0c\u521d\u59cb\u5316Firebase\u9879\u76ee\u53ef\u4ee5\u8fd9\u6837\u8868\u8fbe\uff1a<\/h3>\n<p>\u521d\u59cb\u5316Firebase\u9879\u76ee<\/p>\n<p>\u5982\u679c\u5df2\u7ecf\u4e0e\u9879\u76ee\u5173\u8054\uff0c\u53ef\u80fd\u6700\u597d\u91cd\u65b0\u5f00\u59cb\u4e00\u4e0b\u3002(\u9009\u62e9\u4f7f\u7528Hosting\u548cCloud Functions)(\u9009\u62e9\u4f7f\u7528TypeScript)(&#8220;\u60a8\u60f3\u5c06\u54ea\u4e2a\u76ee\u5f55\u7528\u4f5c\u516c\u5171\u76ee\u5f55\uff1f&#8221;\u4e3adist\/browser\u76ee\u5f55)(&#8220;\u5c06\u5176\u914d\u7f6e\u4e3a\u5355\u9875\u9762\u5e94\u7528\u7a0b\u5e8f\uff1f&#8221;\u662f\u7684)(\u6587\u4ef6dist\/browser\/index.html\u5df2\u7ecf\u5b58\u5728\u3002\u8981\u8986\u76d6\u5417\uff1f&#8221;\u5426&#8221;)<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span>firebase init\r\n\r\n     <span class=\"c\">######## #### ########  ######## ########     ###     ######  ########<\/span>\r\n     <span class=\"c\">##        ##  ##     ## ##       ##     ##  ##   ##  ##       ##<\/span>\r\n     <span class=\"c\">######    ##  ########  ######   ########  #########  ######  ######<\/span>\r\n     <span class=\"c\">##        ##  ##    ##  ##       ##     ## ##     ##       ## ##<\/span>\r\n     <span class=\"c\">##       #### ##     ## ######## ########  ##     ##  ######  ########<\/span>\r\n\r\nYou<span class=\"s1\">'re about to initialize a Firebase project in this directory:\r\n\r\n  .\/projectName\r\n\r\nBefore we get started, keep in mind:\r\n\r\n  * You are currently outside your home directory\r\n\r\n? Are you ready to proceed? Yes\r\n? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices.\r\n ( ) Database: Deploy Firebase Realtime Database Rules\r\n ( ) Firestore: Deploy rules and create indexes for Firestore\r\n (*) Functions: Configure and deploy Cloud Functions\r\n&gt;(*) Hosting: Configure and deploy Firebase Hosting sites\r\n ( ) Storage: Deploy Cloud Storage security rules\r\n? What language would you like to use to write Cloud Functions?\r\n  JavaScript\r\n&gt; TypeScript\r\n? What do you want to use as your public directory? dist\/browser\r\n? Configure as a single-page app (rewrite all urls to \/index.html)? Yes\r\n? File dist\/browser\/index.html already exists. Overwrite? No\r\n\r\n<\/span><\/code><\/pre>\n<h4>\u4fee\u6539server.ts<\/h4>\n<p>\u5c06\u7b2c24\u884c\u7684 `const app = express();` \u66f4\u6539\u4e3a `export const app = express();`\u3002<\/p>\n<p>\u7136\u540e\uff0c\u5c06\u6700\u540e\u7684\u4e09\u884c\u6ce8\u91ca\u6389\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"err\">\u2026<\/span><span class=\"nx\">\u7701\u7565<\/span><span class=\"err\">\u2026<\/span>\r\n<span class=\"c1\">\/\/ Start up the Node server<\/span>\r\n<span class=\"cm\">\/*\r\napp.listen(PORT, () =&gt; {\r\n  console.log(`Node Express server listening on http:\/\/localhost:${PORT}`);\r\n});\r\n*\/<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u8fdb\u884cfirebase deploy\u65f6\uff0c\u9700\u8981\u5c06\u8fd93\u884c\u4ee3\u7801\u6ce8\u91ca\u6389\uff0c\u4f46\u662f\u5728\u8fd0\u884cnpm run serve:ssr\u65f6\u662f\u5fc5\u8981\u7684\u3002\u867d\u7136\u6709\u70b9\u9ebb\u70e6&#8230;\u3002<\/p>\n<h4>\u4fee\u6539firebase.json<\/h4>\n<p>\u4ee5\u4ee5\u4e0b\u65b9\u5f0f\u8868\u8fbe\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"functions\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"predeploy\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"npm --prefix <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">$RESOURCE_DIR<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> run lint\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"npm --prefix <\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">$RESOURCE_DIR<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\"> run build\"<\/span>\r\n    <span class=\"p\">],<\/span>\r\n    <span class=\"nl\">\"source\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"functions\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"nl\">\"hosting\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"public\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"dist\/browser\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"ignore\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"firebase.json\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"**\/.*\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"**\/node_modules\/**\"<\/span>\r\n    <span class=\"p\">],<\/span>\r\n    <span class=\"nl\">\"rewrites\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"p\">{<\/span>\r\n        <span class=\"nl\">\"source\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"**\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"function\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"ssr\"<\/span> <span class=\"err\">\/\/\u5909\u66f4<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">]<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h4>\u4fee\u6539 webpack.server.config.js<\/h4>\n<p>\u8f93\u51fa\uff1a\u5728 {} \u4e2d\u6dfb\u52a0library\u548clibraryTarget\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nx\">output<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">\/\/ Puts the output at the root of the dist folder<\/span>\r\n    <span class=\"nl\">path<\/span><span class=\"p\">:<\/span> <span class=\"nx\">path<\/span><span class=\"p\">.<\/span><span class=\"nx\">join<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">dist<\/span><span class=\"dl\">'<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"nx\">library<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">app<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">libraryTarget<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">umd<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nx\">filename<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">[name].js<\/span><span class=\"dl\">'<\/span>\r\n  <span class=\"p\">},<\/span>\r\n<\/code><\/pre>\n<p>\u5916\u90e8\uff1a\u5982\u4e0b\u6240\u8ff0\u5bf9\u53d8\u66f4\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n  <span class=\"nx\">externals<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n<span class=\"cm\">\/*\r\n\u3000{\r\n    '.\/dist\/server\/main': 'require(\".\/server\/main\")' \/\/ \u30b3\u30e1\u30f3\u30c8\u30a2\u30a6\u30c8\u3059\u308b\r\n  },\r\n*\/<\/span>\r\n  <span class=\"sr\">\/^firebase\/<\/span>\r\n  <span class=\"p\">],<\/span>\r\n<\/code><\/pre>\n<h4>\u8bf7\u7f16\u8f91functions\/src\/index.ts\u6587\u4ef6\u3002<\/h4>\n<p>\u8bf7\u5c06\u4ee5\u4e0b\u4ee3\u7801\u8f6c\u6362\u6210\u4e2d\u6587\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">functions<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">firebase-functions<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">universal<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">cwd<\/span><span class=\"p\">()}<\/span><span class=\"s2\">\/dist\/server`<\/span><span class=\"p\">).<\/span><span class=\"nx\">app<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">ssr<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">functions<\/span><span class=\"p\">.<\/span><span class=\"nx\">https<\/span><span class=\"p\">.<\/span><span class=\"nx\">onRequest<\/span><span class=\"p\">(<\/span><span class=\"nx\">universal<\/span><span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<h4>\u6dfb\u52a0\u4e00\u4e2a\u590d\u5236dist\u6587\u4ef6\u5939\u7684\u6b65\u9aa4<\/h4>\n<p>\u9700\u8981\u5c06\u6784\u5efaAngular\u4e3b\u4f53\u751f\u6210\u7684dist\u6587\u4ef6\u5939\u590d\u5236\u5230functions\u6587\u4ef6\u5939\u4e0b\uff0c\u867d\u7136\u53ef\u4ee5\u624b\u52a8\u64cd\u4f5c\uff0c\u4f46\u5e0c\u671b\u901a\u8fc7\u811a\u672c\u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u4e00\u65e6\u8fd0\u884cnpm run build:ssr\u540e\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5728functions\u6587\u4ef6\u5939\u5185\u5b89\u88c5fs-extra\u3002<\/p>\n<p>Note: The translation provided is in Simplified Chinese.<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>functions\r\n<span class=\"nv\">$ <\/span>npm i fs-extra\r\n<\/code><\/pre>\n<p>\u867d\u7136\u540d\u5b57\u53ef\u4ee5\u968f\u4fbf\u53d6\uff0c\u4f46\u5728functions\u6587\u4ef6\u5939\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3acopy-angular-app.js\u7684\u6587\u4ef6\uff0c\u5e76\u7c98\u8d34\u5e76\u4fdd\u5b58\u4ee5\u4e0b\u7684\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">fs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">fs-extra<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nx\">copy<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">..\/dist<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/dist<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"nx\">then<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"c1\">\/\/ dist\u30d5\u30a9\u30eb\u30c0\u3092functions\u914d\u4e0b\u306b\u30b3\u30d4\u30fc\u3057\u3066\u304b\u3064\/dist\/browser\/index.html\u306f\u524a\u9664\u3059\u308b\u3068\u3044\u3046\u308f\u3051<\/span>\r\n    <span class=\"nx\">fs<\/span><span class=\"p\">.<\/span><span class=\"nx\">remove<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">..\/dist\/browser\/index.html<\/span><span class=\"dl\">'<\/span><span class=\"p\">).<\/span><span class=\"k\">catch<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">REMOVE ERROR: <\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">e<\/span><span class=\"p\">));<\/span>\r\n<span class=\"p\">}).<\/span><span class=\"k\">catch<\/span><span class=\"p\">(<\/span><span class=\"nx\">err<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">COPY ERROR: <\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u8fdb\u884cfirebase deploy\u65f6\uff0c\u9700\u8981\u5220\u9664browser\/index.html\u6587\u4ef6\uff0c\u4f46\u662f\u5728\u8fd0\u884cnpm run serve:ssr\u65f6\u9700\u8981\u4fdd\u7559\u8be5\u6587\u4ef6\u3002\u8be5\u6587\u4ef6\u4f1a\u5728\u8fd0\u884cnpm run build:ssr\u65f6\u91cd\u65b0\u521b\u5efa\u3002\u6709\u70b9\u9ebb\u70e6&#8230;\u3002<\/p>\n<h4>\u4fee\u6539functions\/package.json<\/h4>\n<p>\u4e0d\u8981\u4fee\u6539\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684package.json\u6587\u4ef6\uff0c\u800c\u662f\u4fee\u6539functions\u6587\u4ef6\u5939\u4e0b\u7684package.json\u6587\u4ef6\u3002\u5c06build\u5b57\u6bb5\u4fee\u6539\u4e3a\u4ee5\u4e0b\u5185\u5bb9\uff0c\u4ee5\u4fbf\u8fd0\u884c\u5148\u524d\u521b\u5efa\u7684copy-angular-app.js\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"name\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"functions\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nl\">\"scripts\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"lint\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"tslint --project tsconfig.json\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"build\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"node copy-angular-app &amp;&amp; tsc\"<\/span><span class=\"p\">,<\/span> <span class=\"err\">\/\/\u5909\u66f4<\/span>\r\n    <span class=\"nl\">\"serve\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"npm run build &amp;&amp; firebase serve --only functions\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"shell\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"npm run build &amp;&amp; firebase functions:shell\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"start\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"npm run shell\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"deploy\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"firebase deploy --only functions\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"logs\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"firebase functions:log\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"nl\">\"engines\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"node\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"8\"<\/span>\r\n  <span class=\"p\">},<\/span>\r\n<span class=\"err\">\u2026\u7701\u7565\u2026<\/span>\r\n<\/code><\/pre>\n<h2>Firebase\u672c\u5730\u6d4b\u8bd5\u4e0e\u90e8\u7f72<\/h2>\n<p>\u6211\u5011\u73fe\u5728\u958b\u59cb\u9032\u884c\u6e2c\u8a66\u3002<br \/>\n\u9996\u5148\uff0c\u6211\u5011\u9700\u8981\u7de8\u8b6f Angular \u4e3b\u9ad4\u7a0b\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>npm run build:ssr\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\u6784\u5efa\u51fd\u6570\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>functions\r\n<span class=\"nv\">$ <\/span>npm run build\r\n<\/code><\/pre>\n<p>\u5728\u672c\u5730\u8fd0\u884cFirebase<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"nv\">$ <\/span>firebase serve\r\n<\/code><\/pre>\n<p>firebase serve \u547d\u4ee4\u7528\u4e8e\u5728\u672c\u5730\u73af\u5883\u4e2d\u8fd0\u884c Firebase \u7684\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"err\">$<\/span> <span class=\"n\">firebase<\/span> <span class=\"n\">serve<\/span>\r\n\r\n<span class=\"p\">===<\/span> <span class=\"n\">Serving<\/span> <span class=\"k\">from<\/span> <span class=\"err\">'<\/span><span class=\"p\">.\/<\/span><span class=\"n\">projectName<\/span><span class=\"err\">'<\/span><span class=\"p\">...<\/span>\r\n\r\n<span class=\"p\">!<\/span>  <span class=\"n\">Your<\/span> <span class=\"n\">requested<\/span> <span class=\"s\">\"node\"<\/span> <span class=\"n\">version<\/span> <span class=\"s\">\"8\"<\/span> <span class=\"n\">doesn<\/span><span class=\"err\">'<\/span><span class=\"n\">t<\/span> <span class=\"n\">match<\/span> <span class=\"n\">your<\/span> <span class=\"k\">global<\/span> <span class=\"n\">version<\/span> <span class=\"s\">\"10\"<\/span>\r\n<span class=\"p\">+<\/span>  <span class=\"n\">functions<\/span><span class=\"p\">:<\/span> <span class=\"n\">Emulator<\/span> <span class=\"n\">started<\/span> <span class=\"n\">at<\/span> <span class=\"n\">http<\/span><span class=\"p\">:<\/span><span class=\"c1\">\/\/localhost:5001<\/span>\r\n<span class=\"p\">+<\/span>  \r\n<span class=\"n\">i<\/span>  <span class=\"n\">functions<\/span><span class=\"p\">:<\/span> <span class=\"n\">Watching<\/span> <span class=\"s\">\".\/projectName\/functions\"<\/span> <span class=\"k\">for<\/span> <span class=\"n\">Cloud<\/span> <span class=\"n\">Functions<\/span><span class=\"p\">...<\/span>\r\n<span class=\"n\">i<\/span>  <span class=\"n\">hosting<\/span><span class=\"p\">:<\/span> <span class=\"n\">Serving<\/span> <span class=\"n\">hosting<\/span> <span class=\"n\">files<\/span> <span class=\"k\">from<\/span><span class=\"p\">:<\/span> <span class=\"n\">dist<\/span><span class=\"p\">\/<\/span><span class=\"n\">browser<\/span>\r\n<span class=\"p\">+<\/span>  <span class=\"n\">hosting<\/span><span class=\"p\">:<\/span> <span class=\"n\">Local<\/span> <span class=\"n\">server<\/span><span class=\"p\">:<\/span> <span class=\"n\">http<\/span><span class=\"p\">:<\/span><span class=\"c1\">\/\/localhost:5000<\/span>\r\n<span class=\"p\">+<\/span>  \r\n<span class=\"p\">+<\/span>  <span class=\"n\">functions<\/span><span class=\"p\">[<\/span><span class=\"n\">ssr<\/span><span class=\"p\">]:<\/span> <span class=\"n\">http<\/span> <span class=\"n\">function<\/span> <span class=\"nf\">initialized<\/span> <span class=\"p\">(<\/span><span class=\"n\">http<\/span><span class=\"p\">:<\/span><span class=\"c1\">\/\/localhost:5001\/project\/us-central1\/ssr).<\/span>\r\n<span class=\"p\">[<\/span><span class=\"n\">hosting<\/span><span class=\"p\">]<\/span> <span class=\"n\">Rewriting<\/span> <span class=\"p\">\/<\/span> <span class=\"n\">to<\/span> <span class=\"n\">http<\/span><span class=\"p\">:<\/span><span class=\"c1\">\/\/localhost:5001\/project\/us-central1\/ssr for local Function ssr<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u8bbf\u95eehttp:\/\/localhost:5000\u65f6\uff0c\u4f1a\u8c03\u7528Cloud Functions\uff0c\u5e76\u8fd4\u56de\u5728\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u7684\u7ed3\u679c\u3002<\/p>\n<p>\u5982\u679c\u53ef\u4ee5\u786e\u8ba4\u6b63\u5e38\u542f\u52a8\uff0c\u8bf7\u90e8\u7f72\u5230 Firebase\u3002\u8fd4\u56de\u9879\u76ee\u6839\u76ee\u5f55\u5e76\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>firebase deploy\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>firebase deploy\r\n\r\n<span class=\"o\">===<\/span> Deploying to <span class=\"s1\">'project'<\/span>...\r\n\r\ni  deploying functions, hosting\r\nRunning <span class=\"nb\">command<\/span>: npm <span class=\"nt\">--prefix<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$RESOURCE_DIR<\/span><span class=\"s2\">\"<\/span> run lint\r\n\r\n<span class=\"o\">&gt;<\/span> functions@ lint .projectName\/functions\r\n<span class=\"o\">&gt;<\/span> tslint <span class=\"nt\">--project<\/span> tsconfig.json\r\n\r\nRunning <span class=\"nb\">command<\/span>: npm <span class=\"nt\">--prefix<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$RESOURCE_DIR<\/span><span class=\"s2\">\"<\/span> run build\r\n\r\n<span class=\"o\">&gt;<\/span> functions@ build\r\n<span class=\"o\">&gt;<\/span> node copy-angular-app <span class=\"o\">&amp;&amp;<\/span> tsc\r\n\r\n+  functions: Finished running predeploy script.\r\ni  functions: ensuring necessary APIs are enabled...\r\n+  functions: all necessary APIs are enabled\r\ni  functions: preparing functions directory <span class=\"k\">for <\/span>uploading...\r\ni  functions: packaged functions <span class=\"o\">(<\/span>21.99 MB<span class=\"o\">)<\/span> <span class=\"k\">for <\/span>uploading\r\n+  functions: functions folder uploaded successfully\r\ni  hosting[project]: beginning deploy...\r\ni  hosting[project]: found 122 files <span class=\"k\">in <\/span>dist\/browser\r\n+  hosting[project]: file upload <span class=\"nb\">complete\r\n<\/span>i  functions: updating Node.js 8 <span class=\"k\">function <\/span>ssr<span class=\"o\">(<\/span>us-central1<span class=\"o\">)<\/span>...\r\n+  functions[ssr<span class=\"o\">(<\/span>us-central1<span class=\"o\">)]<\/span>: Successful update operation.\r\ni  hosting[project]: finalizing version...\r\n+  hosting[project]: version finalized\r\ni  hosting[project]: releasing new version...\r\n+  hosting[project]: release <span class=\"nb\">complete<\/span>\r\n\r\n+  Deploy <span class=\"nb\">complete<\/span><span class=\"o\">!<\/span>\r\n\r\nProject Console: https:\/\/console.firebase.google.com\/project\/project\/overview\r\nHosting URL: https:\/\/project.firebaseapp.com\r\n<\/code><\/pre>\n<h2>\u9644\u5f55 (F\u00f9 l\u00f9)<\/h2>\n<p>\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u6211\u5c1d\u8bd5\u4e86SSR\u5316\uff0c\u4f46\u5b83\u5e76\u6ca1\u6709\u592a\u5927\u7684\u8d21\u732e\u3002<\/p>\n<h6>Universal\u5f15\u9032\u4e4b\u5f8c<\/h6>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/94-0.png\" alt=\"image.png\" \/><\/div>\n<h6>\u5728\u5220\u9664Twitter\u5206\u4eab\u6309\u94ae\u5e76\u5bf9\u4ee3\u7801\u8fdb\u884c\u7b80\u5316\u4e4b\u540e<\/h6>\n<p>\u5728\u6240\u6709\u9875\u9762\u4e2d\u90fd\u8bbe\u7f6e\u4e86 Twitter \u5206\u4eab\u6309\u94ae\uff0c\u4f46\u73b0\u5728\u5168\u90e8\u5220\u9664\u4e86\u3002\u6539\u8fdb\u6548\u679c\u663e\u8457\u3002\u65e0\u6cd5\u786e\u5b9a\u4ee3\u7801\u7684\u7cbe\u7b80\u5bf9\u6b64\u6709\u591a\u5927\u8d21\u732e\u3002\u8981\u662f\u8fd9\u6837\u7684\u8bdd\uff0c\u7528 Lazy Load \u597d\u5417&#8230;\uff1f<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/97-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/98-0.png\" alt=\"image.png\" \/><\/div>\n<h6>\u5c06ServiceWorkerModule\u7981\u7528<\/h6>\n<p>\u60f3\u8d77\u6765\u4e00\u4ef6\u4e8b\uff0c\u4e3a\u4ec0\u4e48\u6ca1\u6709\u8fdb\u884cSSR\u64cd\u4f5c\u7684\u60c5\u51b5\u4e0bPWA\u4ecd\u7136\u53ef\u4ee5\u5de5\u4f5c\u5462\uff1f\u6211\u4ed4\u7ec6\u4e00\u770b\uff0c\u539f\u6765\u5728app.module.ts\u6587\u4ef6\u4e2d\u4ecd\u7136\u4fdd\u7559\u4e86ServiceWorkerModule\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ServiceWorkerModule<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@angular\/service-worker<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">@<\/span><span class=\"nd\">NgModule<\/span><span class=\"p\">({<\/span>\r\n  <span class=\"na\">imports<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\r\n<span class=\"nx\">ServiceWorkerModule<\/span><span class=\"p\">.<\/span><span class=\"nx\">register<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">ngsw-worker.js<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">enabled<\/span><span class=\"p\">:<\/span> <span class=\"nx\">environment<\/span><span class=\"p\">.<\/span><span class=\"nx\">production<\/span> <span class=\"p\">}),<\/span>\r\n<span class=\"err\">\u3000<\/span> <span class=\"p\">],<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/102-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u53c2\u8003\uff1a\u5c06Angular 8 Universal\uff08SSR\uff09\u5e94\u7528\u90e8\u7f72\u5230Firebase<br \/>\n\u4f7f\u7528CircleCI\u5c06Angular 8 Universal\u5e94\u7528\u90e8\u7f72\u5230Firebase<br \/>\n\u5728Firebase Cloud Functions\u4e0a\u4f7f\u7528Angular\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u529f\u80fd<br \/>\nAngular Firebase\u51fd\u6570\u90e8\u7f72\u9519\u8bef\uff1a\u627e\u4e0d\u5230\u6a21\u5757&#8217;firebase\/app&#8217;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Angular8\uff1a\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u5b9e\u73b0\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u3002 \u73af\u5883 $ ng &#8211;version [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-39440","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\" \/>\n<meta property=\"og:description\" content=\"Angular8\uff1a\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u5b9e\u73b0\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u3002 \u73af\u5883 $ ng --version [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-26T04:26:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T06:29:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/1-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/\",\"name\":\"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-12-26T04:26:55+00:00\",\"dateModified\":\"2024-04-29T06:29:10+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316","og_description":"Angular8\uff1a\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u5b9e\u73b0\u670d\u52a1\u5668\u7aef\u6e32\u67d3\u3002 \u73af\u5883 $ ng --version [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-12-26T04:26:55+00:00","article_modified_time":"2024-04-29T06:29:10+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d3a4c37434c4406c7d4c6\/1-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/","name":"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-12-26T04:26:55+00:00","dateModified":"2024-04-29T06:29:10+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular 8: \u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\uff0c\u5f15\u5165Universal\u5e76\u8fdb\u884c\u670d\u52a1\u7aef\u6e32\u67d3\u5316"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/angular-8-%e4%b8%ba%e4%ba%86%e6%8f%90%e9%ab%98%e6%80%a7%e8%83%bd%ef%bc%8c%e5%bc%95%e5%85%a5universal%e5%b9%b6%e8%bf%9b%e8%a1%8c%e6%9c%8d%e5%8a%a1%e7%ab%af%e6%b8%b2%e6%9f%93%e5%8c%96%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=39440"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39440\/revisions"}],"predecessor-version":[{"id":85826,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/39440\/revisions\/85826"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=39440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=39440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=39440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}