2021-01-14 更新,原先博客的
grunt-babel
配置不支持文件合并,只能使用通配符的形式。所以这里替换掉插件grunt-babel
为 `grunt-babel-multi-files````”grunt-babel-multi-files”: “^0.2.0”`
package.json
1 | { |
json 不支持注释,这里为了展示之前的一些插件,就使用js的注释
Gruntfile.js
1 | /*jshint esversion: 6 */ |
说明
less编译后修改后缀
grunt-contrib-less
生成单独的文件, 不合并
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 option.less = {
// 编译大量文件时可以用在线编译器找出错位置(https://tool.oschina.net/less)
options: {
compress: true // 是否压缩css
},
web_cn: {
files: [{
expand: true,
cwd: 'less',
src: '×*/*.less',
dest: 'build/<%= meta.revision %>/css/',
ext: '.css'
}],
},
};
解决angular的依赖注入问题
因为angular有依赖注入这个特点,
uglify
插件压缩代码是不安全的,所以要借助grunt
的grunt-ng-annotate
包实现依赖注入。具体可以查看 angular 压缩最佳实践这里引用下Mr_Betty 的回答:
uglify后变量名被替换确实会影响module对依赖的识别(通过字面量), angular的解决办法是在
[]
内将依赖名以字符串的形式作为数组元素声明一遍,如上述的$scope
,最后一个元素接着控制器代码, 这样即便控制器参数中的依赖变量被替换,$inject 服务仍能通过前面的字符串声明取得(字符串不变)。
1
2
3 angular.module('xxx').controller('xxCtrl', ['$scope', function ($scope) {
}]);也可以显示通过$inject服务注入:
1
2
3
4
5
6
7
8 angular.module('app').controller('ActivityCtrl', ActivityCtrl);
ActivityCtrl.$inject = [
'$state',
'$sce'
];
function ActivityCtrl ($state, $sce) {}原理都是一个, 即
angular
中的$inject
服务注入依赖
babel转换新的API
babel默认是只会去转义js语法的,不会去转换新的API,比如像Promise、Generator、Symbol这种全局API对象,babel是不会去编译的。所以上面的配置使用的@babel/preset-env
预设并不能满足项目需求。
由于我们这里使用的是Grunt而不是模块化的打包工具,所以网上的很多配置都是不适用的,查看babel官方文档可以看到,直接在所有js之前引入@babel/polyfill 发布的文件dist/polyfill.js 就行了。
1 | <script src="https://cdn.bootcss.com/babel-polyfill/7.0.0-rc.4/polyfill.min.js"></script> |
推荐阅读:Babel 配置用法解析
本文链接: http://www.ionluo.cn/blog/posts/3d49bc23.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!