模块加载器:npm · webpack · gulp

、将代码模块化之后,我们需要模块加载器来管理这些模块

**npm

*解析
node package managernode包管理器是基于couchdb的一个数据库,
详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。

*作用
管理node包pakeage,包括:安装、卸载、更新、查看、搜索、发布等。
将开发者从繁琐的包管理工作中解放出来,更加专注于功能的开发。
类似App Store 、豌豆荚、360助手的用途

*使用
1 安装Node同时获赠npm
2 在GitBush里通过命令行操作
npm -v 查看npm版本号
sudo npm install npm -g 更新npm版本

3 下载package
npm install xxxx 本地安装 ● 存放在当前node_modules文件夹 ● 只能在当前目录下使用,通过require调用
npm install -g xxxx 全局安装 ● 存放在指定系统文件夹/usr/local/lib/node_modules ● 供命令行(command line)使用的,比如grunt,无法require ● 可能会有权限限制=> sodu...... 管理员身份 ● 可能比较慢=> cnpm...... 国内镜像地址
npm uninstall xxxx 卸载

**4 发布package **
npm init 在当前目录下生成配置文件 package.json

■ package.json
· □ 解析: 以key&vaule的形式列出一个清单 □ 作用: 配置pkg的基本信息;指导npm如何安装这个pkg □ 重要属性: bin 可执行文件目录 => 设置全局快捷键(写入path命令) scripts 定义一些操作方式 => 设置本地快捷键 dependencies 运行pkg功能时的依赖包 => 产品模式 devDependencies 开发pkg时的依赖包(测试用)=> 开发模式

npm install --save xxxx 安装的同时,在配置信息dependencies上保存这个 运行依赖包的信息
npm install --save-dev kkkk 安装的同时,在配置信息devDependencies上保存这个 开发依赖包的信息

■ 有了package.json文件: □ 直接 npm install 就可以安装所有的(运行+开发)依赖包到node_modules中 □ 所以提交代码时,也不用提交node_modules这个文件夹了 □ 执行 npm install --production 即选择产品模式,就只安装dependencies里的依赖包了

■ scripts 在本地使用node时: □ 执行scripts里的key值,就运行vaule里的命令; 即 通过key值配置命令,通过vaule值配置命令代码 □ npm key key值是npm规定范围内的单词,直接运行 ; □ npm run key key值不是npm规定范围内的词,要加run才可以运行

■ bin在全局使用node时: □ 全局安装时,pkg被放入指定系统文件夹/usr/local/lib/node_modules, 同时在/usr/local/bin下创建一个快捷方式,指向/usr/local/lib/node_modules 此时pkg就是一个命令行工具了 => □ 输入bin信息的 key值 就运行vaule里指向的文件 即 通过key值配置全局命令,通过vaule值配置命令文件的地址 □ 这个属性和本地没关系!用不上!

■ node_modules 查找模块时: □ requeire() 有三种形式: 绝对路径 / 相对路径 / node封装好的核心模块(比如path) 如果是以上三种形式,就根据地址直接找 □ 如果不是以上三种形式,就在上一级目录递归查找 node_modules目录 □ 如果查找玩所有的module.path数组还没有,就报错

■ 总结一下,如何发布一个包:
0 注册npm 得到ID
1 npm init 创建package.json,配置pkg信息? 加入github地址
2 npm install --save安装依赖包,并计入pkg信息
3 bin.js新建可执行文件,require(./index) =>指向主文件 :(可以理解为创建快捷方式 吧
4 index.js新建主程序文件,require(xxxx) 使用依赖包,编译代码
5 npm login登录npm
6 npm publish发布pkg

*版本区别
npm2 :以pkg依赖来安装,纯粹的不共享包原则=>重复安装
npm3 :以pkg字母序安装,优先安装在第一层级目录=> 避免重复安装
yarn versus npm :互联网巨头对npm进行优化后得到的一个包管理器,改善了npm一些版本管理混乱;重复下载;下载速度慢等问题。

*webpack

module building system
虽然npm完成了js模块管理,
但是前端代码还需要处理类似CSS、png、webfonts等非JS的文件。
所以我们需要一个既能处理JS又能处理别的资源文件的加载器 。

*解析
webpack 是一个前端资源模块化管理和打包工具。
webpack不关心模块内容、文件格式,所有文件都是模块,只是处理的方式不同;
它只是按 配置文件中规定的方式来处理相应模块。

*作用
它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。
还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。

*优点
1模块不一定要遵守 CMD 或 AMD 等规范
2只打包真正被依赖的资源,按需加载
3可以深度定制打包方案

*配置文件
webpack.config.js □ 解析: 以module.exports对象作为一个出口 以key&vaule的形式列出一个清单 □ 作用: 构建一个兼容本地开发和生产环境的富应用web工程。 □ 重要属性: entry 定义整个编译过程的起点 output 定义整个编译过程的终点 module 定义模块module的处理方式 plugin 对编译完成后的内容进行二度加工 resolve.alias 定义模块的别名

*使用过程
1 使用npm安装webpack
2 写好配置文件webpack.config
3 写好主文件main.js
4 执行webpack生成 编译后的主文件

举例            
webpack-demo         目标目录
  ►index.html            网页                     
  ►webpack.config.js     webpack配置文件
  ►webpack_JS            webpack目录
    ▼dist                   输出目录
      ▷main.js                 编译后的主文件
    ► module1.js            模块1
    ► module2.js            模块2
    ► main.js               引用了模块的主程序文件

**gulp

*解析
○ 基于Nodejs的一个自动化、批量化地处理重复性工作的自动任务运行器。
○ 与webpack侧重于模块打包不同,gulp侧重于流程管理。
○ 借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入 ..使得在操作上非常简单。

*作用
自动化地完成 javascript/coffee/sass/less/html/image/css等文件的
测试 => 检查 => 合并 => 压缩 => 格式化 => 浏览器自动刷新 => 部署文件生成
并监听文件在改动后重复指定的这些步骤。

*使用过程
1 npm install gulp-cli -g全局安装gulp(无法require)
2 npm init生成package.json
3 npm install --save-dev xx 本地安装gulp 并写入开发依赖
4 npm install --save-dev kk本地安装gulp插件
5 新建 gulpfile.js 使用插件编译代码
6运行任务`

gulp API
      gulp.src   引入需要处理的文件
      gulp.dest  导出处理好的文件
      gulp.task  定义一个任务
      guip.watch 监听任务变化
demo
    ■ 图片压缩
     □ 安装插件
       npm install --save gulp-imagemin  

     □ 使用插件
       gulpfile.js 
         var gulp = require('gulp');
         var imagemin = require('gulp-imagemin');     引入插件
         gulp.task('img', function(argument){         定义一个test任务
             gulp.src('src/imgs/*.img')               处理所有.img后缀的文件
                 .pipe(imagemin())                    任务调用的模块
                 .pipe(gulp.dest('dist/imgs'));       处理之后的文件 
         });


    ■ CSS 压缩合并:
     □ 安装插件
         $ npm install --save gulp-minify-css
         $ npm install --save gulp-rename
         $ npm install --save gulp-concat

     □ 使用插件
       gulpfile.js
         var gulp = require('gulp');
         var concat = require('gulp-concat');
         var minifycss = require('gulp-minify-css');
         var rename = require('gulp-rename');
         gulp.task('css', function(argument) {
             gulp.src('src/css/*.css')
                 .pipe(concat('merge.css'))
                 .pipe(rename({
                     suffix: '.min'
                 }))
                 .pipe(minifycss())
                 .pipe(gulp.dest('dist/css/'));
         });


    ■ JS 压缩合并:
     □ 安装插件
         $ npm install --save gulp-uglify
         $ npm install --save gulp-concat
         $ npm install --save gulp-rename

     □ 使用插件
       gulpfile.js
         var gulp = require('gulp');
         var concat = require('gulp-concat');
         var uglify = require('gulp-uglify');
         var rename = require('gulp-rename');
         gulp.task('js', function(argument) {
             gulp.src('src/js/*.js')
                 .pipe(concat('merge.js'))
                 .pipe(rename({
                     suffix: '.min'
                 }))
                 .pipe(uglify())
                 .pipe(gulp.dest('dist/js/'));
         });

参考资料
Linux 命令大全
webpack技术讲解及入门

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

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,134评论 7 35
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey阅读 6,247评论 2 36
  • 前言 众所周知目前比较火的工具就是gulp和webpack,但webpack和gulp却有所不同,本人两者的底层研...
    cduyzh阅读 1,354评论 0 13
  • 题目1: 如何全局安装一个 node 应用? “全局安装”指的是将一个模块安装到系统目录中,各个项目都可以调用。一...
    saintkl阅读 284评论 0 0
  • 前些日子看到一个帖子,心血来潮地就对爸妈说,想吃毛华玉兰饼了。 那一种味道叫熟悉。 熟悉的另一面叫陌生,比如今早被...
    ce2c4243cb2c阅读 245评论 0 1