本篇文章给大家谈谈angular-cli:切换到webpack后,环境文件替换中断(使用`ngeject`),以及angular环境变量的知识点,同时本文还将给你拓展angular,webpack中的
本篇文章给大家谈谈angular-cli:切换到webpack后,环境文件替换中断(使用`ng eject`),以及angular 环境变量的知识点,同时本文还将给你拓展angular ,webpack 中的、Angular 2,使用Angular Cli和Ui Router Ng2,Resolve / Reject、Angular AOT Webpack NgTools – 问题生成ngFactory、Angular CLI 6.0.1如何控制dev环境和webpack等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- angular-cli:切换到webpack后,环境文件替换中断(使用`ng eject`)(angular 环境变量)
- angular ,webpack 中的
- Angular 2,使用Angular Cli和Ui Router Ng2,Resolve / Reject
- Angular AOT Webpack NgTools – 问题生成ngFactory
- Angular CLI 6.0.1如何控制dev环境和webpack
angular-cli:切换到webpack后,环境文件替换中断(使用`ng eject`)(angular 环境变量)
看起来除了环境文件替换之外,一切都正常工作,在angular-cli.json中指定:
"environmentSource": "environments/environment.ts","environments": { "dev": "environments/environment.ts","prod": "environments/environment.prod.ts" }
现在根本没有替换,它总是使用“environments / environment.ts”文件.
有没有办法让它在没有重大更改webpack配置的情况下工作?
还为angular-cli github项目创建了an issue.
在webpack里面我更改了AotPlugin插件的配置:
hostReplacementPaths: { 'environments/environment.ts': environmentFiles[NODE_ENV] }
当然还有指定的环境文件:
const environmentFiles = { 'development': 'environments/environment.dev.ts','staging': 'environments/environment.stag.ts','production': 'environments/environment.prod.ts' };
angular ,webpack 中的
问题:使用angular-cli搭建的项目,执行ng build后,浏览器打开空白,发现文件的路径不对
解决方案: 在package.json文件的scripts中添加命令:
"build":"ng build --base-href ./"
在以下为Angular Cli的各个配置中修改
"deployUrl": "//cdn.com.cn", // 指定站点的部署地址,该值最终会赋给webpack的output.publicPath,常用于CDN部署
在webpack中 output.publicPath
以下为Angular Cli的各个配置项说明。
{
"project": {
"name": "angular-questionare",
"ejected": false // 标记该应用是否已经执行过eject命令把webpack配置释放出来
},
"apps": [
{
"root": "src", // 源码根目录
"outDir": "dist", // 编译后的输出目录,默认是dist/
"assets": [ // 记录资源文件夹,构建时复制到`outDir`指定的目录
"assets",
"favicon.ico"
],
"index": "index.html", // 指定首页文件,默认值是"index.html"
"main": "main.ts", // 指定应用的入门文件
"polyfills": "polyfills.ts", // 指定polyfill文件
"test": "test.ts", // 指定测试入门文件
"tsconfig": "tsconfig.app.json", // 指定tsconfig文件
"testTsconfig": "tsconfig.spec.json", // 指定TypeScript单测脚本的tsconfig文件
"prefix": "app", // 使用`ng generate`命令时,自动为selector元数据的值添加的前缀名
"deployUrl": "//cdn.com.cn", // 指定站点的部署地址,该值最终会赋给webpack的output.publicPath,常用于CDN部署
"styles": [ // 引入全局样式,构建时会打包进来,常用语第三方库引入的样式
"styles.css"
],
"scripts": [ // 引入全局脚本,构建时会打包进来,常用语第三方库引入的脚本
],
"environmentSource": "environments/environment.ts", // 基础环境配置
"environments": { // 子环境配置文件
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
}
}
],
"e2e": {
"protractor": {
"config": "./protractor.conf.js"
}
},
"lint": [
{
"project": "src/tsconfig.app.json"
},
{
"project": "src/tsconfig.spec.json"
},
{
"project": "e2e/tsconfig.e2e.json"
}
],
"test": {
"karma": {
"config": "./karma.conf.js"
}
},
"defaults": { // 执行`ng generate`命令时的一些默认值
"styleExt": "css", // 默认生成的样式文件后缀名
"component": {
"flat": false, // 生成组件时是否新建文件夹包装组件文件,默认为false(即新建文件夹)
"spec": true, // 是否生成spec文件,默认为true
"inlineStyle": false, // 新建时是否使用内联样式,默认为false
"inlineTemplate": false, // 新建时是否使用内联模板,默认为false
"viewEncapsulation": "Emulated", // 指定生成的组件的元数据viewEncapsulation的默认值
"changeDetection": "OnPush", // 指定生成的组件的元数据changeDetection的默认值
}
}
}
Angular 2,使用Angular Cli和Ui Router Ng2,Resolve / Reject
所以我有一个“菜单服务”,它从我设置的模拟数据库中获取类别.该服务运行良好,我能够列出类别,并使用这些类别来获取子类别和项目.我正在使用无URL的参数,即我将它们声明为对象,并使用[UiParams]传递它们.所有这一切都运行良好,我甚至可以使用后退按钮’uiSref =“^”’进入父状态.太棒了.但!出于测试目的,我正在使用ui-router-visualizer,我遇到的问题是,即使对象为空,我仍然可以转换到状态.从我的理解中看,该对象已被解析,并返回为空.这当然可以防止错误,但是如果用户神奇地以子状态结束,则放入一个空对象,然后什么都不显示.这会导致错误本身,因为视图没有内插任何内容.这也会导致后退按钮发生故障,因为ui-params不可用.
现在,所有这一切,如果菜单服务中的返回对象为空,我如何拒绝状态转换?
代码对于州.我正在使用Ng2StateDeclaration.
{ name:'category',parent:'main.categories',params:{ categoryid:{} },views:{ '$default@main': { component: SubcategoryComponent },receipt: { component: ReceiptComponent } },resolve:[ { token:'category',deps: [Transition,MenuService],resolveFn: (trans,menuSvc) => { menuSvc.getCategory(trans.params().categoryid) } } ] }`
以下是菜单服务的完整代码.这非常简单.
import { Injectable,Inject } from '@angular/core'; import { Headers,Http,Response} from '@angular/http'; import 'rxjs/add/operator/toPromise'; @Injectable() export class MenuService { constructor(@Inject(Http) public http:Http) { } getCategories() { return this.http.get('api/menu') .map(this.extractData) .toPromise(); } private extractData(res: Response) { let body = res.json(); return body.data || { }; } getCategory(id){ console.log(id); return this.getCategories() .then(cats => cats.find(cat => cat.id == id)); } }
而且组件也非常基础.我正在使用他们的quickstart-app作为我的主要学习工具.
import { Component,Input,Inject } from '@angular/core'; @Component({ templateUrl: './subcategory.component.html',styleUrls: ['./subcategory.component.css'],inputs: ["category"],}) export class SubcategoryComponent { category; }
如果有人能指出我回答这个问题的某个地方,或者告诉我在哪里以及如何放入一个返回对象或拒绝状态转换的If / Else语句,那就太棒了.我也在构建类似quickstart示例的内容,因此这些内容都位于主应用程序模块的单独模块中.
对于整个过程我仍然非常环保,所以当涉及到控制状态转换的业务逻辑时,我不太确定在哪里做准确的工作.
提前致谢!
解决方法
Now,all of that being said,how do I reject the state transition if the return object from my menu service is empty?
如果resolve函数返回被拒绝的promise,则转换将错误并且不会运行.由于你的getCategory函数返回并且没有找到空对象(而不是被拒绝的promise),你将不得不在服务中或在解析中拒绝它.
不管怎样,你可以写一个这样的帮手:
const rejectWhenEmpty = (val) => val ? val : Promise.reject('value is empty)
然后在没有加载任何值时使用它来拒绝解析
resolveFn: (trans,menuSvc) => menuSvc.getCategory(trans.params().categoryid).then(rejectWhenEmpty)
或在服务中:
getCategory(id){ return this.getCategories() .then(cats => cats.find(cat => cat.id == id)) .then(rejectWhenEmpty); }
Angular AOT Webpack NgTools – 问题生成ngFactory
ERROR in window is not defined ERROR in /Users/nataliecoley/development/company-app-name/src/main-aot.ts (2,36): Cannot find module '../aot/src/app/app.module.ngfactory'. ERROR in ./src/main-aot.ts
找不到模块:错误:无法解析’/ Users / nataliecoley / development / company-app-name / src’中的’../aot/src/app/app.module.ngfactory’
@ ./src/main-aot.ts 2:0-73
目前我一直在忽略第一个问题(部分是因为我似乎无法在网上发现任何其他人有这个错误,部分是因为我搜索了我的整个代码库,不包括节点模块,并且窗口不会出现在任何地方代码)但我愿意接受建议,如果有人知道可能来自哪里(或者你认为它与错误2和3有关).
我认为第二个和第三个错误消息是我的问题的主要来源,因为很明显app.module.ts没有在main-aot.ts之前编译,所以当main-aot.ts去编译它时找不到该文件.但是,我根据我发现的文档进行了设置,以便在编译器到达main-aot.ts时已经编译好了app.module.ngfactory.
很明显,我的设置中缺少一些部分,因为我在网上找到的每个解决方案设置略有不同,我似乎无法缩小范围.我所知道的是,到目前为止我没有尝试过的任何内容消除了这个错误(或者产生了任何其他新错误),并且我很乐意帮助那些成功设置AOT ngTools webpack Angular以帮助缩小这里发生的事情.
这是我的文件结构(简化):
. +-- config/ | +-- helpers.js | +-- webpack.common.js | +-- webpack.dev.js | +-- webpack.prod.js +-- src/ | +-- app/ | +-- assets/ | +-- vendor/ | +-- index.html | +-- main.ts | +-- main-aot.ts | +-- polyfills.ts | +-- tsconfig.json +-- package.json +-- server.js +-- tsconfig-aot.json +-- webpack.config.aot.js +-- webpack.config.js (only contains: module.exports = require('./config/webpack.dev.js');)
我用来运行我的aot构建的命令(我从我分享给角文档的第一个链接中的设置中提取)是“build:aot”:“webpack –config webpack.config.aot.js”,in我的package.json.至于相关软件包版本,我在4.1.0所有角度软件包,我使用的是@ ngtools / webpack v1.3.1,以及webpack v 2.3.3和typescript v2.3.0
注意:我已经看到了一些关于aot和某些打字稿/角度版本的问题,但我们真的希望坚持这些部分以与我们的其他Angular应用程序保持一致(现在生产超过一年,目前在v4上. 1.0,对降级没有兴趣)以及支持strictnullchecks等等.我知道我听说有人让AOT使用这些版本,任何人都不得不使用旧版本的Angular似乎很荒谬使用AOT所以我觉得必须有一种方法让它工作.
这是我的tsconfig-aot.json:
{ "compilerOptions": { "target": "es5","module": "es2015","moduleResolution": "node","sourceMap": true,"emitDecoratorMetadata": true,"experimentalDecorators": true,"lib": [ "es2015","dom" ],"noImplicitAny": true,"suppressImplicitAnyIndexErrors": true,"removeComments": false,"noUnusedLocals": true,"noUnusedParameters": true,"strictnullchecks": true,"skipLibCheck": true,"skipCodeGeneration": false,"typeRoots": [ "../node_modules/@types/" ] },"files": [ "src/app/app.module.ts","src/main-aot.ts" ],"compileOnSave": true,"angularCompilerOptions": { "genDir": "aot","entryModule": "src/app/app.module#AppModule","skipMetadataEmit": true } }
这是我的webpack.config.aot.js:
const ngtools = require('@ngtools/webpack'); const webpack = require('webpack'); const helpers = require('./config/helpers'); module.exports = { devtool: 'source-map',entry: { main: './src/main-aot.ts' },resolve: { extensions: ['.ts','.js'] },target: 'node',output: { path: helpers.root('dist'),filename: 'build.js' },plugins: [ new ngtools.AotPlugin({ tsConfigPath: helpers.root('tsconfig-aot.json'),entryModule: helpers.root('src','app','app.module#AppModule') }),new webpack.optimize.UglifyJsPlugin({ sourceMap: true }) ],module: { rules: [ { test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,loader: 'file-loader?name=assets/[name].[hash].[ext]' },{ test: /\.css$/,loader: 'raw-loader' },{ test: /\.scss$/,loaders: ['to-string-loader','style-loader','css-loader','resolve-url-loader','sass-loader?sourceMap'] },{ test: /\.html$/,{ test: /\.ts$/,loader: '@ngtools/webpack' } ] } }
关于entryModule的注释.在一些资源中,我看到stateModule选项必须在tsconfig-aot.json中,而不是在webpack.config.aot.js中,我见过的其他例子只在webpack.config.aot中. JS.我在tsconfig-aot.json中尝试过它只是webpack.config.aot.js及以上两者 – 这些选项似乎都无法解决问题.我也尝试编辑各种文件的路径(比如我的tsconfig-aot.json中的文件数组),以防我设置它,因为它在我的文件的错误位置找不到它.
这是我的主要内容:
import { platformbrowser } from '@angular/platform-browser'; import { AppModuleNgFactory } from '../aot/src/app/app.module.ngfactory'; platformbrowser().bootstrapModuleFactory(AppModuleNgFactory);
我担心它会成为我错过的一个愚蠢的小作品,但到目前为止我一直在尝试一切,似乎很多其他人在网上也在努力使用这个设置,似乎没有任何关于如何做到这一点的在线清楚信息,所以我想我会发布在这里,希望实际上成功地在Angular Webpack应用程序中工作的人可以指出我正确的方向或共享资源,帮助他们解决它出.提前致谢!
解决方法
I had some trouble with the path to the ngfactory code when compiling with ngc: Can’t resolve ‘./../path/to/app/app.module.ngfactory’ This seems related to this issue. The solution for me was to define the genDir in the webpack config rather than the tsconfig.js file.
但是,ngtools会为您完成所有这些操作,因为它旨在成为一个完整的黑盒AOT机制.您正在将ngc(即ngfactory generation)与Angular CLI的AOT前端(ngtools)混合使用.
如果您想使用ngfactories,您必须使用ngc构建您的应用程序.就个人而言,我使用ngtools进行开发构建,然后使用ngc和Angular Universal服务器端渲染器.
请注意,ngtools有一个错误,使开发相当痛苦 – 在第二次重新编译之前,将无法识别更改:
https://github.com/angular/angular-cli/issues/5137
我怎么用这个东西?
我的webpack配置与你的配置非常相似,然后我在生产版本中使用ngc来生成工厂……
的package.json:
"aot": "./node_modules/.bin/ngc -p tsconfig-aot.json",
并使用工厂和服务器端渲染……
server.ts:
import 'reflect-Metadata'; import 'zone.js/dist/zone-node'; import { 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 = process.env.PORT || 8081; 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}!`); });
Angular CLI 6.0.1如何控制dev环境和webpack
"configurations": { "production": { "optimization": true,"outputHashing": "all","sourceMap": false,"extractCss": true,"namedChunks": false,"aot": true,"extractLicenses": true,"vendorChunk": false,"buildOptimizer": true,"fileReplacements": [ { "replace": "src/environments/environment.ts","with": "src/environments/environment.prod.ts" } ] }
我想要做的是控制开发环境.例如,将sourceMap更改为false,我不希望通过向ng build添加参数来实现.在angular.json中有没有相当于生产的参考开发?
还有一些非常重要的事情:在Angular-CLI 6中没有弹出!那怎么可能看到并修改webpack.config.js呢?
解决方法
"projects": { "MyProject": { "root": "","sourceRoot": "src","projectType": "application","architect": { "build": { "builder": "@angular-devkit/build-angular:browser","options": { "outputPath": "dist","index": "src/index.html","main": "src/main.ts","tsConfig": "src/tsconfig.app.json","polyfills": "src/polyfills.ts",//Add settings here "sourceMap": false,"fileReplacements": [ { "replace": "src/environments/environment.ts","with": "src/environments/environment.anotherdevenv.ts" } ]
这些设置按原样用于dev env,因此您可以修改它(但如果它们不覆盖指定的设置,这将影响其他环境)
您还可以创建自己的“开发”配置(例如,通过复制生产conf,并根据需要进行更改),并在该conf中指定特定于开发环境的设置.然后运行以下命令
ng serve -c development
弹出命令暂时被禁用,但应该根据角度cli团队核心成员的评论很快添加(https://github.com/angular/angular-cli/issues/10945)
关于angular-cli:切换到webpack后,环境文件替换中断(使用`ng eject`)和angular 环境变量的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于angular ,webpack 中的、Angular 2,使用Angular Cli和Ui Router Ng2,Resolve / Reject、Angular AOT Webpack NgTools – 问题生成ngFactory、Angular CLI 6.0.1如何控制dev环境和webpack的相关知识,请在本站寻找。
本文标签: