詳解如何使用webpack+es6開發(fā)angular1.x
雖然,現(xiàn)在越來(lái)越多的人選擇使用react、vue以及ng2,但是依然存在相當(dāng)一部分人在使用angular1.x開發(fā)。本文將介紹如何使用webpack+es6+angular1.x+$oclazyLoad實(shí)現(xiàn)動(dòng)態(tài)加載。
1.webpack
webpack.config.js
var path = require('path');
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
entry: {
home: [
'babel-polyfill',
'./app/app.js' //引入文件
],
common: [
'babel-polyfill',
'angular',
'angular-ui-router',
'oclazyload'
]
},
output: {
path: path.join(__dirname, '/wap'),
filename: '[name].js',
chunkFilename: '[id].build.js?[chunkhash]',
publicPath: '/wap/',
},
module: {
loaders: [
{
test:/\.js?$/,
loader:'ng-annotate-loader!babel-loader',
exclude:/node_modules/
},
{
test: /\.html$/,
loader: 'raw-loader',
exclude: /node_modules/
},
]
},
resolve: {
root: ['node_modules'],
extensions: ['', '.js', '.html', '.json'],
modulesDirectories: ['node_modules'],
alias: {}
},
externals: {},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new ExtractTextPlugin('[name].[contenthash:20].css'),
new webpack.optimize.UglifyJsPlugin({
compress: {warnings: false},
sourceMap: true
}),
new webpack.optimize.CommonsChunkPlugin('common', 'common.js')
]
}
2.Module
第一步,先引入angular ,以及相關(guān)模塊,然后像es5中那樣定義一個(gè)模塊
app.js
import angular from 'angular';
import uirouter from 'angular-ui-router';
import ocLazyLoad from 'oclazyLoad';
angular.module('app',[ uirouter,ocLazyLoad ])
模塊與模塊之間引用
我們建立第二個(gè)模塊 header/index.js
import angularfrom 'angular';
export default angular.module('header',[]).name
修改app.js
import header from './header'
angular.module('app',[ uirouter,ocLazyLoad , header])
模塊的引用完成
3.控制器
假設(shè)在header目錄下新增一個(gè)控制器
header/controller.js
export default class HeaderController {
consturctor(){
this.home = 'header'
}
}
引用控制器 修改 header/index.js
import HeaderController from './controller'
export default angular.module('header',[ ])
.controller('HeaderController',HeaderController)
.name
4.服務(wù)
如果要在控制器內(nèi)使用$scope,或者其他服務(wù)肯定是報(bào)錯(cuò)的,那是因?yàn)槲覀冊(cè)谑褂弥皼]有注入服務(wù)
所以第一步應(yīng)該注入服務(wù)
header/controller.js
export default class HeaderController {
consturctor($scope){
this.home = 'header'
$scope.component = 'head'
}
}
HeaderController.$inject = ['$scope']
那么如何自定義服務(wù)呢?
新建 header.server.js
class HeaderServices {
constructor(){
this.name = 'cxh'
}
getName(){
return this.name
}
}
header/index.js
import HeaderService from './service';
export default angular.module('header',[ ])
.controller('HeaderController',HeaderController)
.service('HeaderService',HeaderService)
.name
在控制器中使用自定義服務(wù)
header/controller.js
export default class HeaderController {
consturctor($scope,HeaderService){
this.home = 'header'
$scope.component = 'head'
$scope.name = HeaderService.getName
}
}
HeaderController.$inject = ['$scope','HeaderService']
5.指令
新建 footer/index.js 大致和 header/index.js相同
將 footer模塊 引入到 app.js
新建footer/directive.js
export default class Footer {
constructor(){
this.restrict = 'E',
this.scope = {},
this.template = "<div ng-click='alert()'>footer</div>"
this.controller = Foot
this.link = (scope, element, attr) => {}
}
}
class Foot{
constructor(){
$scope.alert = () => { alert(1) }
}
}
Header.$inject = ['$scope']
footer/index.js
export default angular.module('footer',[])
.directive('footerDirective',()=> new Footer)
.name
6.路由
router.js
export default router ($stateProvider, $urlRouterProvider) {
$stateProvider.state("home",{
url:"/home",
templateUrl:'app/home/home.html',
controller: "HomeController",
controllerAs:"HMC",
})
$urlRouterProvider.otherwise('/home');
}
router.$inject = [ '$stateProvider', '$urlRouterProvider']
DEMO 實(shí)現(xiàn)動(dòng)態(tài)加載
1.第一步,新建app.js創(chuàng)建一個(gè)module
import angular from 'angular';
import uirouter from 'angular-ui-router';
import ocLazyLoad from 'oclazyLoad';
//引用創(chuàng)建頭部 組件
import Header from './header';
//路由
import routing from "./router.js";
//引入兩個(gè)子模塊
import Home from "./homes";
import Router from "./router";
angular.module('app',[uirouter, Header, ocLazyLoad, Home, Router])
.config(routing)
2.配置路由 ./route.js
export default function routing($stateProvider, $urlRouterProvider) {
'ngInject'; //注入服務(wù) 就不需要使用$inject了
$stateProvider
.state("home",{
url:"/home",
templateProvider: ($q) => { //動(dòng)態(tài)引入html模板
'ngInject';
let deferred = $q.defer();
require.ensure([], function () {
let template = require('./home/home.html');
deferred.resolve(template);
});
return deferred.promise;
},
controller: "HomeController",
controllerAs:"HMC",
resolve: { //動(dòng)態(tài)加載模塊
loadMyCtrl: function ($q, $ocLazyLoad) {
'ngInject';
let deferred = $q.defer();
require.ensure([], () => {
let module = require("./home").default;
$ocLazyLoad.load({name: module.name});
deferred.resolve(module.controller)
});
return deferred.promise;
}
}
}),
.state("route",{
url:"/route",
templateProvider: ($q) => { //動(dòng)態(tài)引入html模板
'ngInject';
let deferred = $q.defer();
require.ensure([], function () {
let template = require('./router/router.html');
deferred.resolve(template);
});
return deferred.promise;
},
controller: "routerController",
controllerAs:"RTC",
resolve: { //動(dòng)態(tài)加載模塊
loadMyCtrl: function ($q, $ocLazyLoad) {
'ngInject';
let deferred = $q.defer();
require.ensure([], () => {
let module = require("./router").default;
$ocLazyLoad.load({name: module.name});
deferred.resolve(module.controller)
});
return deferred.promise;
}
}
})
$urlRouterProvider.otherwise('/home');
}
3.header
header/index.js
import angular from "angular";
import header from './directive';
export default angular.module('app_header',[])
.directive('header', () => new header)
.name;
header/directive.js
class Header {
constructor($scope){
'ngInject';
$scope.isshow = false;
}
}
export default class header {
constructor() {
this.restrict = 'E',
this.scope = {},
this.template = require(./header.html)
this.controller = Header
this.link = (scope, element, attr) => {}
}
}
header/header.html
<div> <a href="#home" rel="external nofollow" >home</a> <a href="#router" rel="external nofollow" >router</a> </div>
4.home
home/index.js
import angular from "angular";
import HomeController from './controller';
export default angular.module('app_home',[])
.controller('HomeController', HomeController)
home/controller.js
export default class HomeController {
constructor($scope) {
'ngInject';
this.isshow = false;
this.eage = 'sds';
$scope.edg = 'sma'
}
change(){
this.isshow = !this.isshow;
console.log(this.isshow);
}
}
home/home.html
<div>home {{HMC.eage}} -- {{edg}}</div>
其余的模塊大同小異就不依依去寫了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AngularJS入門教程之?dāng)?shù)據(jù)綁定用法示例
這篇文章主要介紹了AngularJS之?dāng)?shù)據(jù)綁定用法,結(jié)合實(shí)例形式分析了AngularJS基于內(nèi)置指令ng-model實(shí)現(xiàn)數(shù)據(jù)綁定的操作技巧,需要的朋友可以參考下2016-11-11
Angularjs實(shí)現(xiàn)mvvm式的選項(xiàng)卡示例代碼
每位Web開發(fā)者應(yīng)該都知道,選項(xiàng)卡是現(xiàn)代web網(wǎng)頁(yè)中最常用的效果之一,所以本文重點(diǎn)是用angularjs這個(gè)非常火mvvm框架,實(shí)現(xiàn)選項(xiàng)卡效果。有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-09-09
詳解Angular的內(nèi)置過(guò)濾器和自定義過(guò)濾器【推薦】
在實(shí)際的開發(fā)過(guò)程中,很多后端返回給我們的數(shù)據(jù)都是需要格式化處理的,在angular中為我們內(nèi)置提供了filter指令,可以很方便的對(duì)數(shù)據(jù)進(jìn)行處理。本文將對(duì)Angular的內(nèi)置過(guò)濾器和自定義過(guò)濾器進(jìn)行詳細(xì)介紹,下面跟著小編一起來(lái)看下吧2016-12-12
AngularJS實(shí)現(xiàn)注冊(cè)表單驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了AngularJS實(shí)現(xiàn)注冊(cè)表單驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
淺談angular4 ng-content 中隱藏的內(nèi)容
本篇文章主要介紹了淺談angular4 ng-content 中隱藏的內(nèi)容,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
淺談關(guān)于angularJs中使用$.ajax的注意點(diǎn)
本篇文章主要介紹了關(guān)于angularJs中使用$.ajax的注意點(diǎn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Angular實(shí)現(xiàn)圖片裁剪工具ngImgCrop實(shí)踐
本篇文章主要介紹了Angular實(shí)現(xiàn)圖片裁剪工具ngImgCrop實(shí)踐,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08

