版权声明:此文首发于我的个人站Angular2开发踩坑系列-生产环境编译,转载请注明出处。

公司移动端项目需要技术选型,此前仅仅是学过ng2会用而已,于是想趁着这个项目,深入学习一下angular2就提议给CTO。最终选择了angular2作为 前端框架,于是填坑之路 开始了....

下边说几个在生产环境编译的时候遇到的天坑..ToT

使用ng build --prod--aot编译出来的文件,部署到服务器之后,在微信内置浏览器和手机谷歌浏览器上可以打开网站,但是在国内安卓手机的系统内置浏览器以及UC浏览器等打不开,始终停留在loading界面

我曾天真以为手机上没有兼容性问题,可以放肆的'玩耍',没想到啊没想到,居然有这么一个巨坑。。

在我费劲心思百谷找寻原因未果之后,在PC上安装了安卓abd调试工具,下载了UC开发者版本,然后连接电脑,在谷歌浏览器控制台查找原因,终于发现了报了一行错

TypeError: 'undefined' is not a function

这是什么鬼??点开具体报错的位置之后发现,在一行编译后的代码里 object.assign()这个方法报错了,这是一个es6的方法,并且angular-cli配制的转版本无法将object.assign()转成es5版本,所以UC就不支持了。。

于是,在寻找解决方法。。此处省略一万字

最终在stackoverflow上找到两位大神的回答:


根据这两位大神 所述,安装babel-polyfill的npm包后,引入就好了。

你以为就这么完了??

我在src目录下polyfills.ts中引入,结果编译完放到服务器上又有了新的报错。。

还有引入顺序的问题。。新引入的babel-polyfill把Zone.js的Promise方法覆盖掉了,导致编译又出错了。。

然后我在polyfills.ts中找到引入 zone.js的地方,将babel-polyfill的引入写在了 这里,

/***************************************************************************************************
 * Zone JS is required by Angular itself.
 */
import 'babel-polyfill';
import 'zone.js/dist/zone';  // Included with Angular CLI.

总算 这个问题解决了。手机UC浏览器和安卓系统内置浏览器 终于可以正常打开了。

BUT,每次打开超级慢,网络状况良好,但就是打开的特别慢,在loading界面转十几到二十几秒钟才进来,这次的问题在微信、谷歌、UC、安卓浏览器上无一例外

又百谷起来。。。此处省略两万字

找了好久,原来angular-cli的ng build --prod--aot(这是看着大漠穷秋的ng2视频上学的指令)该指令是不正确的,现在我这样执行的仅仅是

ng build 普通编译

所以编译后的文件大小 和 源代码的大小几乎一致。应该使用的是预编译(AOT),现在的angular-cli中已经将预编译(AOT)包含在了ng build --prod指令中,那么我应该是用的是ng build --prod指令,没错。

于是,我输入ng build --prod 回车,然后,然后就悲剧了。。。


上百条的报错,,我看了一下,报错最多的是:

Property ‘x’ is private and only accessible within class ‘MyComponent’

我在不知道什么网站上找到了解释:

翻译: 使用AOT,类中的私有属性和方法只能在类中访问。 要访问模板中的属性或方法,属性或方法必须声明为public。

使用typescript定义变量时,用到public、private、protect,在不进行预编译(AOT)时,private的变量在html模板中使用是不会报错的,但使用了AOT后,要求的很严格,即使是同一个component中,只要不只是在ts文件中使用,就应该定义为public。

SO,我又将所有ts文件中在本文件之外调用的private定义的变量/函数变成了public。
然后再次执行 ng build --pord,,又失败了。。

Property ‘x’ is private and only accessible within class ‘MyComponent’
上一个报错没有了,还有不少别的报错

Property 'username' does not exist on type 'UserInfo'

经过再次排查,发现因为typescript是强类型语言,在进行AOT编译时,从后端接口中获取的数据应该有对应的interface与之对应,在开发过程中我们并没有这么做,可以正常运行,但AOT不行。

于是又新建了数个接口文件,将这些用到的对象都按照服务器返回的数据格式进行定义interface,随后再引入组件的ts类中。这里请参考微软typescript中文网文档

改完之后,再次执行ng build --prod,终于完美编译~~此时的我内牛满面ToT~
编译后的文件比源文件少了一半的大小,编译后的js都是压缩过的

填了三天坑,总算把ng2生产环境编译的坑填平了(暂时的~)

Angular2开发踩坑系列-生产环境编译的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部