Gruntjs NPM vs.鲍尔vs.Browserify vs.吞咽vs.咕噜vs.网页包
我试图总结一下我对最流行的JavaScript包管理器、绑定器和任务运行器的了解。如果我错了,请纠正我:Gruntjs NPM vs.鲍尔vs.Browserify vs.吞咽vs.咕噜vs.网页包,gruntjs,npm,gulp,bower,webpack,Gruntjs,Npm,Gulp,Bower,Webpack,我试图总结一下我对最流行的JavaScript包管理器、绑定器和任务运行器的了解。如果我错了,请纠正我: npm和bower是包管理器。他们只是下载依赖项,不知道如何自己构建项目。他们知道的是在获取所有依赖项后调用webpack/gulp/grunt bower类似于npm,但它构建了一个平坦的依赖树(不像npm那样递归地进行)。意思是npm获取每个依赖项的依赖项(可能多次获取相同的依赖项),而bower希望您手动包含子依赖项。有时,bower和npm分别用于前端和后端(因为每个兆字节在前端可
和npm
是包管理器。他们只是下载依赖项,不知道如何自己构建项目。他们知道的是在获取所有依赖项后调用bower
/webpack
/gulp
grunt
类似于bower
,但它构建了一个平坦的依赖树(不像npm
那样递归地进行)。意思是npm
获取每个依赖项的依赖项(可能多次获取相同的依赖项),而npm
希望您手动包含子依赖项。有时,bower
和bower
分别用于前端和后端(因为每个兆字节在前端可能很重要)npm
和grunt
是任务执行者,负责自动化所有可以自动化的事情(即编译CSS/Sass、优化图像、制作捆绑包并缩小/传输)gulp
与grunt
(类似于gulp
与maven
或配置与代码)。Grunt基于配置单独的独立任务,每个任务打开/处理/关闭文件。Gulp需要更少的代码量,并且基于节点流,这允许它构建管道链(不重新打开同一文件),并使其速度更快李>gradle
(webpack
)-对我来说,它是一个任务运行程序,可以热加载更改,让你忘记所有JS/CSS观察器李>webpack dev server
/npm
+插件可能会取代任务运行程序。它们的能力经常是交叉的,因此如果你需要在bower
+插件上使用npm
/gulp
,它们会有不同的含义。但对于复杂的任务,任务运行程序肯定更好(例如,“在每个构建创建包上,从ES6传输到ES5,在所有浏览器模拟器上运行,制作屏幕截图,并通过ftp部署到dropbox”)grunt
允许为浏览器打包节点模块browserify
vsbrowserify
的node
实际上是require
webpack
&webpack开发服务器
?官方文档说它是一个模块绑定器,但对我来说,它只是一个任务运行器。有什么区别browserify
?我们不能对node/ES6导入执行相同的操作吗李>
npm
+插件上使用gulp
/grunt
网页包开发服务器 Webpack Dev Server提供了与Browsersync类似的解决方案,Browsersync是一种开发服务器,您可以在使用应用程序时快速部署应用程序,并立即验证开发进度,dev服务器在代码更改时自动刷新浏览器,甚至将更改的代码传播到浏览器,而无需重新加载所谓的热模块替换
任务运行程序与NPM脚本 我一直在使用Gulp,因为它简洁易懂,但后来发现我根本不需要Gulp和Grunt。我所需要的一切都可以使用NPM脚本通过API运行第三方工具来完成在“咕噜”、“咕噜”或“NPM”脚本之间进行选择取决于您团队的品味和经验。 虽然Gulp或Grunt中的任务即使对于不太熟悉JS的人来说也很容易阅读,但它是另一个需要学习的工具,我个人更喜欢缩小依赖关系,让事情变得简单。另一方面,将这些任务替换为NPM脚本和运行这些第三方工具的(可能是JS)脚本的组合(例如,为清理目的配置和运行节点脚本)可能更具挑战性。但在大多数情况下,这三者在结果上是相等的。
例子 至于示例,我建议您看看这个,它向您展示了NPM和JS脚本的良好组合,涵盖了整个构建和部署过程。您可以在根文件夹中名为
scripts
的属性中的package.json
中找到这些NPM脚本。在那里,您将主要遇到com
const bs = Browsersync.create();
bs.init({
...(DEBUG ? {} : { notify: false, ui: false }),
proxy: {
target: host,
middleware: [wpMiddleware, ...hotMiddlewares],
},
// no need to watch '*.js' here, webpack will take care of it for us,
// including full page reloads if HMR won't work
files: ['build/content/**/*.*'],
}, resolve)
gulp.task('bundle', function() {
// bundling source files with some gulp plugins like gulp-webpack maybe
});
gulp.task('start', function() {
// starting server and stuff
});
project root
[node_modules] // default directory for dependencies
-> dependency A
-> dependency B
[node_modules]
-> dependency A
-> dependency C
[node_modules]
-> dependency B
[node_modules]
-> dependency A
-> dependency D
project root
[bower_components] // default directory for dependencies
-> dependency A
-> dependency B // needs A
-> dependency C // needs B and D
-> dependency D
require(["package/myModule"], function(myModule) {
myModule.foobar();
});
<script src=“app/require.js” data-main=“main.js” ></script>
npm install -g –save-dev browserify
browserify entry-point.js -o bundle-name.js
npm install -g –save-dev webpack
webpack ./entry-point.js bundle-name.js
var $ = require('jquery');
$('body').append("I've imported jQuery!");
<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
System.import("scripts/display.js");
</script>
npm install -g yo
npm install --global generator-h5bp
yo h5bp
var gulp = require('gulp'),
minifyCSS = require('gulp-minify-css'),
sass = require('gulp-sass'),
browserify = require('gulp-browserify'),
uglify = require('gulp-uglify'),
rename = require('gulp-rename'),
jshint = require('gulp-jshint'),
jshintStyle = require('jshint-stylish'),
replace = require('gulp-replace'),
notify = require('gulp-notify'),
{
"scripts": {
"start": "npm http-server"
},
"devDependencies": {
"http-server": "^0.10.0"
}
}