詳解如何使用webpack+es6開發(fā)angular1.x
雖然,現(xiàn)在越來越多的人選擇使用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)文章
Angular實(shí)現(xiàn)的進(jìn)度條功能示例
這篇文章主要介紹了Angular實(shí)現(xiàn)的進(jìn)度條功能,結(jié)合實(shí)例形式較為詳細(xì)的分析了angular進(jìn)度條功能的相關(guān)界面布局、功能等操作技巧,需要的朋友可以參考下2018-02-02Angular2中select用法之設(shè)置默認(rèn)值與事件詳解
在Angular.JS中可以使用數(shù)組或?qū)ο髣?chuàng)建一個(gè)下拉列表選項(xiàng)。關(guān)于Angular.js中select的基礎(chǔ)相信大家應(yīng)該都已經(jīng)了解了,那么下面這篇文章主要給大家介紹了Angular2中select用法之設(shè)置默認(rèn)值與事件的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05在Angular項(xiàng)目使用socket.io實(shí)現(xiàn)通信的方法
這篇文章主要介紹了在Angular項(xiàng)目使用socket.io實(shí)現(xiàn)通信的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01詳解angular路由高亮之RouterLinkActive
這篇文章主要介紹了詳解angular路由高亮之RouterLinkActive,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Angular 2 利用Router事件和Title實(shí)現(xiàn)動(dòng)態(tài)頁面標(biāo)題的方法
本篇文章主要介紹了Angular 2 利用Router事件和Title實(shí)現(xiàn)動(dòng)態(tài)頁面標(biāo)題的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Angular5整合富文本編輯器TinyMCE的方法(漢化+上傳)
TinyMCE是一個(gè)輕量級(jí)的富文本編輯器,相對(duì)于CK編輯器更加精簡(jiǎn),但必須滿足絕大部分場(chǎng)景的需要。這篇文章主要介紹了Angular5整合富文本編輯器TinyMCE(漢化+上傳)的相關(guān)知識(shí),需要的朋友可以參考下2020-05-05AngularJS iframe跨域打開內(nèi)容時(shí)報(bào)錯(cuò)誤的解決辦法
這篇文章主要介紹了AngularJS iframe跨域打開內(nèi)容時(shí)報(bào)錯(cuò)誤的解決辦法,需要的朋友可以參考下2015-01-01