本文为原创,转载请注明出处: cnzt 文章:cnzt-pjavascript
http://www.cnblogs.com/zt-blog/p/7779384.htmlcss
写在前面:html
由于最近总结本身以前作过的东西,因此顺便总结了这一篇,要发布文章时,恰好看到手机推送消息“angular5发布啦”啊哈哈哈哈哈哈。我无论我仍是要把关于angular1的这篇文章放上来由于还涉及到webpack呢啊哈哈哈哈哈哈哈哈…… html5
Angularjs+webpack实现模拟微信菜单编辑功能java
npm install --save-dev webpacknode
npm install --save-dev webpack@<version>webpack
webpack.config.jsgit
npm install angular@1.5.8 –save-devangularjs
webpackes6
webpack-dev-server (webpack-dev-server --hot --inline)
http://localhost:8080/
本地开发时,设置热加载可以实现本地更改即时反应到页面效果。
设置时注意:
配置publicPath;
bundle.js在server中的路径: http://localhost:8080/{publicPath}/bundle.js
Webpack自己只识别js文件,可是项目中一般除了js文件外,还有css,img,url等各类文件,loader就是为了让webpack也能识别这些文件并将其模块化。
安装:
npm install style-loader css-loader --save-dev
npm install file-loader --save-dev
(全部loader详见package.json)
Webpack是以模块方式(入口文件+模块依赖)管理项目的,因此咱们须要给项目加入模块化功能,咱们采用ES6的模块化实现方式,须要先安装babel加载器编译ES6:
npm install --save-dev babel-loader babel-core babel-preset-es2015
ng,ngRoute,ngSanitize,ngAnimate…
定义angular模块:
angular.module('app.wxPageModule', []);
angular.module('app. wxPanelModule', []);
Angular内置指令: ngApp, ngController, ngModel, ngView, … , {{}}
自定义指令--组件:
wxPanelModule.directive('wxPanel', function() {
return {
restrict: 'E', //AEC
templateUrl: './src/components/wxPanel/wxPanelTemplate.html',
link: function($scope, elm, attr, controller) {
//能够操做dom,例如绑定dom事件
},
controller: function($scope, $element, $attrs) {
//组件的控制器
},
scope: {
//隔离做用域,定义组件变量
}
}
})
自定义指令依赖angularjs的HTML编译器($compile)对元素附加一些特定的行为。
定义控制器:
wxPanelModule.controller('wxPanelCtrl', [ '$scope', function($scope){ // $scope做用域
//数据模型
$scope.a=1;
$scope.getA=function(){ … };
//添加方法,能够在模板中经过表达式或ngClick等事件调用
}])
做用域scope:
当一个控制器经过 ng-controller 指令被添加到DOM中时,ng 会调用该控制器的构造函数来生成一个控制器对象,这样,就建立了一个新的子级 做用域(scope)。在这个构造函数中,做用域会做为$scope参数注入其中,并容许用户代码访问它。
通常状况下,咱们使用控制器作两件事:
1.初始化 $scope 对象
2.为 $scope 对象添加行为(方法)
控制器定义在各个模块中,每一个控制器都有本身的做用域,所以造成一条做用域链,层级结构对应dom树结构。根做用域为$rootScope。
做用域提供了$watch方法监听数据模型变化,提供了$apply(执行$digest,检查全部由 $watch监听的数据并将其以前的值进行比较)方法将飞angular环境中发生的数据模型改变同步到angular做用域中。 (applyàdigestàwatch)
|
做用域的事件传播机制:
$broadcast $emit $on
Service:
控制器应该尽量保持单纯,例如获取后台服务数据的逻辑应该封装在service中,经过依赖注入到controller中。Service一样也是定义在module上面的。
据模型始终是应用的单一数据源
脏检查----见scope小节
背后是经过Injector来建立和查找依赖的。
注入方式:
moduleA.controller('ctrl1',['$scope','dep1', 'dep2',…, function($scope, dep1, dep2,…){ … }]);
webpack帮助咱们绑定各个模块,并构建出一张依赖图。
配置文件导出的是一个对象(CommonJS模块)
示例:
const path = require('path');
module.exports = {
entry: './index.js',
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: "/assets/",
filename: 'bundle.js' //"bundle-[name]-[hash:8].js",
},
module: {
rules: [{
test: /\.js$/,
use: 'babel-loader?presets=es2015'
}, {
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
};
将各类类型的文件进行模块化,以后咱们就能够import了。例若有了css-loader咱们就能够直接在js文件里import css文件。
特色:链式;可接收参数;最终返回javascript ;
更多loader请参考:https://webpack.js.org/loaders/
插件是对loader的补充,能够用来作优化/压缩等,webpack自己也是也是一种插件的形式。
e.g.代码压缩:
注:使用js压缩时,最好使用数组方式依赖注入,不然可能压缩不成功。
更多插件请参考: https://webpack.js.org/plugins/
webpack
webpack-dev-server (webpack-dev-server --hot --inline)
http://localhost:8080/
官网:https://webpack.js.org/concepts/
Angular模块:
2. 自定义的angular模块,如angular.module('app.wxPageModule', []);
ES6模块:
import …
export …
以文件为单位
Angular进行为实现双向绑定,进行脏检查时会频繁用到$watch方法,因此不要在此方法里作与dom相关的操做,影响效率。
一个angular页面理想情况为200左右的$watch,通常你们默认2000$watch为上限(IE),这是为了页面更好的体验效果,而并不意味着必定是angular dirty check上限。
$locationProvider.html5Mode(true).hashPrefix('!');
{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
}
顺序:postcss-->css-->style
最后的最后,demo的github地址: https://github.com/tinatingzhang/angualrjs_webpack
angular.element(aDomElement).XXX
//AMD
require(['moduleA', 'moduleB'], function (moduleA, moduleB){
alert('加载成功');
});
//CMD
seajs.use("../static/hello/src/main")
//CommonJS
module.export = {
name:'rouwan'
}
//es6模块
import {module1, module2} form './module.js';
export {module1}