自动化构建

process.env.NODE_ENV读环境变量

Gulp

优化前端开发流程的工具。基于流,gulp.src使用glob定义路径,将匹配文件以pipe流形式导入gulp插件处理
处理完毕通过gulp.dest写入指定目录

task异步方法返回:
1.return pipe
2.return promise
3.callback

gulp.task('scripts', [], function () {
  return gulp.src(path.join(config.paths.www, 'js/**/*.js'))
    //处理angularJs代码注入为annotate模式
    .pipe(glp.ngAnnotate())
    //写入tmp/scripts
    .pipe(gulp.dest(path.join(config.paths.tmp, '/scripts')));
});

//创建浏览器实时刷新
var borowserSync = require('browser-sync').create();

gulp.task('sass', function(){
    return gulp.src('sass/**/*.js')
        //文件改变,浏览器刷新
        .pipe(browserSync.stream())
        //文件改变,局部更新
        .pipe(browserSync.reload({stream:true}));
});

//启动浏览器服务
function browserSyncInit(baseDir, browser) {
  glp.browserSync.init({
    startPath: '/',
    server: './',
    browser: browser,
    port: 8000,
    ui: {
      port: 8001
    },
    notify: false
  });
};

gulp.watch('sass/**/*.scss', ['sass']);
//浏览器刷新
gulp.watch('*.html').on('change', browserSync.reload);

入口文件:
gulpfile.js

常用插件:
browserSync
gulp
gulp-load-plugins
gulp-inject将js,css注入html
gulp-useref将html中引入的所有文件,以block定义合并
gulp-rev文件添加版本号
gulp-revReplace用添加版本号的文件替换index.html中引用文件
gulp-uglify压缩JS
gulp-csso压缩CSS
gulp-minifyHtml压缩Html
gulp-css-spriter雪碧图
gulp-sass编译sass文件为css
gulp-concat合并js
gulp-sequence
browserify

运行
gulp taskName

Gulp + Browserify
CommonJs规范:
模块加载同步, Node也采用CommonJS规范
每个文件就是一个模块,有自己的作用域

module.exports.fun = function(){}
//exports变量指向module.exports
//不能直接将exports = function(){}因为这样等于切断exports与module.exports关系
exports.fun = function()
require('./fun')

但使用ES6模块语法可替代Browserify

Webpack

模块化解决方案。分析项目结构,找到JavaScript模块以及其它的一些浏览器不能直接拓展的语言(Scss, TypeScript)等,将其转换打包为合适的格式供浏览器使用

配置devtool节点生成Source Maps
配置devserver组件,实现浏览器监听代码修改

webpack-dev-server(需另安装)
小型Node.js Express服务器,使用webpack-dev-middleware服务webpack包
webpack-dev-server
静态服务器,类似express,只用于开发环境
2种刷新模式:iframe mode, inline mode
启动:webpack-dev-server -open
Hot Module Replacement(HMR)允许修改组件代码后,自动刷新实时预览,只更新部分,而不是页面重载

Loaders
调用外部脚本或工具,实现对不同格式的文件处理

Plugins
拓展Webpack功能,在整个构建过程中生效
Loaders是在打包构建过程中用来处理源文件的(JSX, Scss..),插件并不直接操作单个文件,直接对整个构建过程作用

常用插件
BannerPlugin打包后文件加版权
HtmlWebpackPlugin依据简单index.html模板,生成一个自动引用你打包后JS文件的新index.html
OccurenceOrderPlugin为组件分配ID
UglifyJsPlugin压缩JS
ExtractTextPlugin分离CSS和JS文件
CommonsChunkPlugin提取公共js

Babel
编译javascript的平台(ES6,ES7,JSX)
配置文件.babelrc

module.exports = {
    entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
    output: {
        path: __dirname + "/build",//打包后的文件存放的地方
        filename: "bundle-[hash].js"//打包后输出文件的文件名
    },
    devtool: 'eval-source-map',
    devServer: {
        contentBase: "./public",//本地服务器所加载的页面所在的目录
        historyApiFallback: true,//不跳转
        inline: true
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader"
                },
                exclude: /node_modules/
            },
            {
                test:/\.css$/,
                use:[
                    {loader:"style-loader"}
                    {loader:"css-loader", options:{modules:true}}
                ]
            }
        ]
    },
    plugins: [
        new webpack.BannerPlugin('版权所有,翻版必究'),
        new HtmlWebpackPlugin({
            template: __dirname + "/app/index.tmpl.html"
        }),
        new webpack.optimize.OccurrenceOrderPlugin(),
        new webpack.optimize.UglifyJsPlugin(),
        new ExtractTextPlugin("style.css")
    ]
};

//打包多页应用的方案
...
entry:{
    'about':'../about.js', 
    'product':'../product.js',
    vendor:['jquery', 'react']}
    plugins:[
        new HtmlWebpackPlugin({
            favicon:'', filename:'../views/about.html',         
            template:'../about.html', 
            chunks:['vendor', 'about']
        }),
        new HtmlWebPackPlugin({...})
    ]
}

运行
生成package.json运行npm init
package.json中"scripts"{"pc-prod": "webpack --config webpack.prod.config.js --display-error-details"}
npm run pc-prod

AMD规范与CommonJS规范

CommonJs规范加载模块是同步的,只有加载完成,才执行后面的操作
AMD规范异加载模块是异步的,允许指定回调函数,使用defined定义模块

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容