环境搭建

如果你已经迫不及待想要跳过教程直接开始自己折腾了,这里已经有一份现成的项目备份了。你可以运行下列命令立刻开始自己第一个 Angular2之旅。

# 下载项目
git clone https://github.com/musicq/angular2-webpack-express-starter.git

# 安装依赖
npm install

# 启动
npm start

环境要求

  • node v4.5.0+

之所以选择 4.x.x 的版本是因为我们要搭建的 Angular2 的应用是想要一个能够较为稳定的环境,而且并不需要太多 node 新版本的功能,只需要用到一些 es6 的新特性就够了。如果你追求新的更酷的 node 新特性,也可以使用 6.x.x 以上的版本。

创建项目

首先为我们的应用起一个你喜欢的名字,这里我想为它起名为 awesome-start

cd ~

# 创建项目目录
mkdir awesome-start && cd awesome-start

# 初始化项目
npm init -y

到目前为止我们已经成功创建了我们的项目,Angular2 并不像 Angular1 那样有一个单独的 js 文件,他是通过 npm 安装的,所以为了能够让我们的应用能够跑起来,我们需要往项目里面添加一些列的配置文件来搭建我们的 Angular2 应用。

配置文件

有很多种方法能够把 Angular2 跑起来,官方的 git@quickstart 是一种最为快捷的方法,只需要把他 clone 下来,安装后直接启动就行了。这个项目用来学习 ng2 很好,如果想要用在产品和中大型应用开发的话,还是不太合适。我们这里使用的是 webpack 来打包我们的应用。

为了能够配置好我们的项目,你需要在项目中加入以下几个文件

  • package.json 此文件在我们初始化时已经自动添加了

  • tsconfig.json 定义了 TypeScript 编译器如何从项目源文件生成 JavaScript 代码

  • webpack.config.js webpack 入口文件,用来告诉 webpack 如何打包我们的应用

完整的代码可以在 这里@package.json 找到,为了节约篇幅,这里只列出主要的几项内容。

// @angular2 的依赖包

"dependencies": {
    "@angular/common": "^2.1.0","@angular/compiler": "^2.1.0","@angular/core": "^2.1.0","@angular/forms": "^2.1.0","@angular/http": "^2.1.0","@angular/platform-browser": "^2.1.0","@angular/platform-browser-dynamic": "^2.1.0","@angular/platform-server": "^2.1.0","@angular/router": "^3.1.0","core-js": "^2.4.1","reflect-Metadata": "^0.1.8","rxjs": "5.0.0-beta.12","zone.js": "^0.6.25"
}

上面的依赖是几乎每一个 Angular2 应用必须的内容。将 完整的 package.json 全部安装好之后我们就可以进入下一步了。

# 安装依赖
npm install

webpack 打包配置

到这里,我们已经把我们整个应用主要的依赖全部安装完成了。接下来我们只要专心写配置和内容就好了。

我们想要让我们的程序能够不管在正式环境还是开发环境都能很方便的切换,所以我们需要两份甚至更多的 webpack 配置文件(测试环境)来应对更多的场景需求。

@webpack.config.js

这是 webpack 的入口文件,我们根据不同的环境切换不同的打包规则。

switch (process.env.NODE_ENV) {
    case 'prod':
    case 'production':
        module.exports = require('./config/webpack.prod')({env: 'production'});
        break;
    case 'dev':
    case 'development':
    default:
        module.exports = require('./config/webpack.dev')({env: 'development'});
}

@webpack.common.js webpack 通用配置截取

{
    ...,entry: {
        polyfills: './src/polyfills',vendor: './src/vendor',main: './src/main',},resolve: {
        extensions: ['','.ts','.js']
    },module: {
        loaders: [
            {
                test: /\.ts$/,loaders: [
                    'awesome-typescript-loader','angular2-template-loader',// 使 angular2 支持 webpack 1.x 懒加载
                    'angular2-router-loader'
                ],exclude: [/\.(spec|e2e)\.ts$/]
            },{ // 处理全局样式
                test: /\.css$/,exclude: helpers.root('src','app'),loader: ExtractTextPlugin.extract('style','css?sourceMap','postcss')
            },{ // 处理组件内样式
                test: /\.css$/,include: helpers.root('src',loaders: ['to-string-loader','css-loader','postcss']
            },{
                test: /\.html$/,loader: 'raw-loader',exclude: [helpers.root('src/index.html')]
            },{
                test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,loader: 'file?name=assets/[name].[hash].[ext]'
            }
        ],...
}

@webpack.dev.js webpack 开发环境打包配置截取。

很多同学往往都会同时做 node 跟前端开发,改了前端代码要刷新一次浏览器,改了后端代码又要重启一次浏览器,真的费时费力还没效率,所以为了能够让我们两端都能够不用手动刷新,我们在 webpack 的开发环境配置时加入一个代理,代理我们后端的地址,这样就避免了前后端不能同时一起开发的问题,还能应用 webpack-dev-server 特点实时刷新浏览器。

devServer: {
    port: MetaDATA.port,host: MetaDATA.host,historyApiFallback: true,stats: 'minimal',watchOptions: {
        aggregateTimeout: 300,poll: 1000
    },outputPath: helpers.root('dist'),// 将 node 服务转接到 4000 端口
    // 这样就可以同时获得 webpack-dev-server 的实时刷新
    // 也能同时调试接口
    proxy: {
        '/api': {
              target: 'http://localhost:4000'
        }
    }
},

@webpack.prod.js webpack 正式环境打包配置截取。

output: {

    path: helpers.root('dist'),/**
     * 插入文件的访问路径
     * Example:
     * [webpack.config.js] publicPaht: '/dist'
     * [index.html] <script src="/dist/a.js"></script>
     */
    publicPath: '/',filename: '[name].[chunkhash].bundle.js',sourceMapFilename: '[name].[chunkhash].bundle.map',chunkFilename: '[id].[chunkhash].chunk.js'
},

可执行脚本

在我们的 package.json 中有一个 script 字段,这里面有我们程序可执行的一系列脚本。

"scripts": {
    "start": "concurrently \"npm run start:hmr\" \"npm run dev:server\"","start:hmr": "npm run server:dev:hmr","server": "npm run server:dev","server:dev": "webpack-dev-server --progress --profile --watch --content-base dist/","server:dev:hmr": "npm run server:dev -- --inline --hot","server:prod": "pm2 start process.yml","dev:server": "NODE_ENV=development nodemon --use_strict bin/www","build:prod": "npm run clean && webpack --progress --profile --bail","lint": "tslint \"src/**/*.ts\" -t verbose","clean": "npm run rimraf -- dist","rimraf": "rimraf"
}
  • start: 「开发环境」 启动我们的程序,同时启动前端和后端,并且为热更新

  • start:hmr: 「开发环境」 启动 webpack 打包前端程序并启动前端,端口为 3000

  • dev:server: 「开发环境」 启动 node 服务,端口为 4000

  • build:prod: 「正式环境」 打包应用,准备部署

  • lint: 「开发环境」 测验 TypeScript 代码是否符合我们自定义的规范

小结

本章我们介绍了一个 Angular2 应用的环境配置。很麻烦是不是,没错,由于 Angular2 这次的完全组件化,我们只能从 npm 安装它,这就使得对 node 不熟悉的同学更头疼了,再加上前端一堆繁琐复杂的打包和任务工具,使得这个配置又增加了很大的复杂度。复杂是一件好事,因为他说明前端正向着工程化进展。不过对于首次接触的同学来说真的是很难找到入手点,没关系,你完全可以不管这些配置怎么样,直接用官方提供的 git@quickstart 来进行你的 Angular2 的学习,等你熟练了,再慢慢重构自己的项目,使得它能够更加健壮。

或者,你也可以选择我的这套方案,使用方法很简单,你只要照着 这份 README 做就可以了。如果一切都很顺利的话,当你安装完成后,只要运行 npm start,你的程序就能跑起来了。

如果失败了,也别怕,你可以在 这里 提出你的问题,我会在看到后第一时间尽力为你解答。

Ok,下面一章我们就要讲如何开始一个 Angular2 组件了。

祝你有一个好的开始!

《Angular2 从开发到部署系列》之「环境搭建」的更多相关文章

  1. iOS推送通知适用于Dev而不是Enterprise Distribution

    本网站上没有其他问题,我已经能够找到实际上提出了Dev将工作的原因,但企业分布不会.为什么归档总是使aps环境生产?

  2. ios – testflight库和Xcode 5没有变化现在说“ld:找不到-lTestFlight的库”

    我已经创建了几个月的应用程序,突然Xcode5不想构建它.它只是抱怨以下错误.如果我理解它可以,它会抱怨testflight,但我几周没有改变它.它完美地编译了它.我不得不说我已经尝试将AdobeADMS跟踪库添加到项目中.然后,出现链接器错误.任何提示?

  3. 如何在ios swift项目中为dev n prod使用两个不同的GoogleService-info.plist文件?

    我需要使用两个不同的GoogleService-info.plist来处理dev和prod构建,目前我只是通过在编辑方案中更改“构建配置”来分离dev和prod,但现在我需要有两个不同的.plist文件dev和prod用于处理谷歌分析,pushwoosh等,解决方法对于这种情况,您需要在Dev和Prod的项目中使用带有diffbundleid的不同Targets.之后,您可以链接GoogleSer

  4. openstack安装liberty--安装对象存储服务swift

    通常使用CACHE技術提高性能Accountservers賬戶服務,管理對象存儲中的賬戶定義。Containerservers容器服務,在對象存儲中管理容器或文件夾映……Objectservers對象服務,在存儲節點管理實際的對象,比如文件。Wsgimiddleware處理認證,通常使用OPENSTACKIdentityswiftclient為用戶提供命令行接口使用RESTAPIswift-init初始化和構建RING文件腳本swift-recon一個命令行工具,用於檢索群集的各種度量和測試信息。

  5. (Cross-)编译Swift for Raspberry PI

    Swift现在是开源的.有没有人试过编译Swift的RaspBerryPI?我开始做,但我的8GBSD卡似乎太小了;)是否可以从Ubuntu交叉编译?写Swift打开你最喜欢的文本编辑器,编写一个程序并保存它:编译它并运行它:而已!

  6. Swift 3 dev快照中的POST请求给出了“对成员’dataTask的模糊引用(with:completionHandler :)’

    编辑:我注意到有人在我之后写了这个问题的副本.这里的答案是更好的答案.使用URLRequest结构.在Xcode8中工作正常:另外,出现此错误的原因是URLSessionAPI具有相同的名称方法,但每个都采用不同的参数.因此,如果没有明确的演员,API将会混淆.我认为这是API的命名错误.发生此问题,代码如下:

  7. Android Studio是否支持用于Android UI设计的AngularJS?

    我对AndroidStudio有疑问:AS在设计XML文件时是否支持AngularJS代码,例如:对于小动画或效果?

  8. android – 如何使用ClientID和ClientSecret在Phonegap中使用Angularjs登录Google OAuth2

    我正尝试使用Angularjs(使用IonicFramework)通过GoogleOAuth2从我的Phonegap应用程序登录.目前我正在使用http://phonegap-tips.com/articles/google-api-oauth-with-phonegaps-inappbrowser.html进行登录.但是当我使用Angular-UI-RouterforIonic时,它正在创建非常

  9. 针对不同环境的不同Android构建

    我希望能够构建和安装我的应用程序的多个版本(同时),针对不同的环境,如开发,暂存和生产.AndroidManifest.xml中的软件包名称似乎是这里的主要障碍,因为它是唯一标识应用程序的内容.我认为可以简单地在com.mydomain.prod,com.mydomain.staging和com.mydomain.dev之间切换或某种类似的约定,但到目前为止,我还没有运气的包装结构对于这种方法.我

  10. android – 如何在Google Play商店中打开开发者页面(market://)

    ),但我在AndroidDeveloper页面上找不到它.解决方法您只需调用market://dev?id=xxx即可例如.:我希望,这适合您的需求!

随机推荐

  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作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部