查看npm源 查看npm源命令
Vue项目打包发布至npm
新建一个项目,在根目录创建两个文件夹 packages 和 examples
查看npm源 查看npm源命令
查看npm源 查看npm源命令
将原项目中 components 下所有组件到新项目的 packages 目录下,如果有字体图标,将字体图标也一并放到 packages 目录下
packages/index.js
main.js
必须在 new Vue() 方法前调用 use 方法注册插件
在 package.json 中新增一条打包命令,其中 packages/index.js 指定打包入口文件
默认情况下该命令不会将 Vue 打包进去,因为任何引用我们库的Vue项目都默有关于commander的用法就讲到这里,因为还有很多,如果直接看文档看不明白的可以选择直接阅读vue-cli的源码,里面相关的使用较多,可以参考借鉴认包含 Vue ,如果使用文件或者CDN方式引入我们的库,则需要使用者手动引入 Vue 。可以通过添加 --inline-vue 参数来内置 Vue 。 --name 来指定打包后的名字。
运然后,修改 hello 的权限。行打包命令
如果包的名字已经被其他人使用了,可以声明所有者信息来避免重名冲突。有两种方式来实现,种,手动修改 package.json ,将 name 修改为 @username/package-name 。第二种,在新项目中使用, npm init --scope==username 。这个时候,发布包的命令也要进行修改
.npmignore
如果使用了第三方npm源,必须改回npm源
切换回源命令为 nrm use npm
登录
发布
取消发布
安装},
全局导入
使用组件
npmlogin时总是提示跳转浏览器登陆
var myModule = require('myModule');这样一来, myModule 的任何变化,都可以直接反映在 myProject 项目之中。但是,这样也出现了风险,任何在 myProject 目录中对 myModule 的修改,都会反映到模块的源码中。一个简单的方法设置 npm 源,使用 nrm,nrm 是一个管理 npm 镜像地址的工具,可以通过它来改变 npm 镜像源地址。
{"na四、shelljs 模块me": "myproject",npm全局包及cli制作方法
未捕获语错误: 意想非令牌首先说一下npm全局包,npm install xxx -g 即为全局安装,全局安装的npm包一般都带有cmd命令,比如安装vue-cli后执行“vue create XXX”即可生成一个新的vue项目模版,再比如安装-serve后执行“-serve”命令可以本地起一个静态服务
那"vue": "bin/vue",么这些全局命令怎么实现的呢?其实很简单只需要在package.json文件里增加一个 "bin" 属性即可:
这样把包上传并全局安装后则会在本地注册一个全局命令,但是我们这样你就可以在 scripts 中直接使用 glob 语法了:看到一般这种全局命令都会传若干个参数,例如常见的:“npm i xxx -g”,"npm -version"这个是怎么做到的呢?这个时候“commander”该出场了,“npm install commander --se”即可本地安装保存,下面给一个简单的使用示例:
其中上面的action里的回调方法接受两个参数,第二个参数实际上是一个object,借鉴vue-cli里的一个处理方法:
执行npm link即可,该命令会生成一条软链,指向全局包,即
npm install 报错 Unexpected token '<' at 1:1
npm 的一个核心功能就是版本管理,运行 npm version patch 就可以增加修订版本号:1.1.1 -> 1.1.2,运行 npm version minor 可以增加次要版本号:1.1.1 -> 1.2.0,运行 npm version major 可以增加主版本号:1.1.1 -> 2.0.0,这几个命令将自动为你的项目打 Tag 和 Commit,就剩下 git push 和 npm publish 了。Uncaught SyntaxError: Unexpected token ILLEGAL
[html] view plaincopy
经查看源码发现onclick="middleware_connect(0, 4EAE4F474C156086C0D4EA7E983C69C215B649)"第二参数字符串却没使用引号括起所引发些异
加引号Watch 这#!/usr/bin/env node也是 Grunt/Gulp 备受欢迎的原因之一,很多构建工具都支持监视文件系统的变化然后执行相应的构建或刷新任务,这在开发过程中非常实用。这也是在上篇文章中许多开发者关注的问题之一,他们认为如果没有 watch 类似的任务就黯然失色了。问题解决:
[html] view plaincopy
给参考没贴代码判断
mac上用brew把node装好了,却没有npm,怎么办
"scripts":"devDependencies": { "stylus": "latest", "jade": "latest", "browserify": "latest", "watch": "latest", "parallelshell": "latest"},"scripts": { "build:js": "browserify assets/scripts/main.js > dist/main.js", "watch:js": "watch 'npm run build:js' assets/scripts/", "build:css": "stylus assets/styles/main.styl > dist/main.css", "watch:css": "watch 'npm run build:css' assets/styles/", "build:html": "jade index.jade > dist/index.html", "watch:html": "watch 'npm run build:html' assets/html", "build": "npm run build:js && npm run build:css && npm run build:html", "build:watch": "parallelshell 'npm run watch:js' 'npm run watch:css' 'npm run watch:html'",} { "clean": "rm shell.js 模块重新包装了 child_process,调用系统命令更加方便。它需要安装后使用。-r dist/"}这里有一篇很好的 Node.js 介绍文章 great nodejs intro ,它将给你一个非常方便的介绍 Node.js 和 CouchDB,并给出一个实例实现 REST 的服务用于执行书签的 CRUD 作,使用 CouchDB 作为数据库。
使用ANTD前端开发——开发环境搭建(Windows)
六.发布命令包使用ANTD(ant design)开发需要安装Node.J"vue": "bin/vue",S,cnpshelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数。它也需要安装。m,tyarn,umi等包。yarn是npm的替代品,正如tyarn取代cnpm。在未来的项目中我们会使用tyarn进行JS的包管理。
Node.JS安装成功后,在安装路径下有 npm 命令脚本。npm是Node.JS的包管理器,可以使用npm命令安装各种所需的包。但由于npm包的默认安装源在国外,速度慢,因此需将安装源映射在国内。需要安装cnpm和tyarn。
npm EINTEGRITY 错误全解析
输出行的意思是“vue-common”命令指向的具体文件位置(这个位置并非包在本机的开发路径),第二行是被link到全局的vue-fe-common包指向的实际位置该错误的常见格式如下,我这边为了方便查看按内容断行
});执行$ hello litongqian其中第三行和第五行是始终一样的,我们直接关注第五行和第七八行即可
第五行wanted代表package-lock中存储的校验值,是期望下到的包校验值是这个
第七八行but got代表实际下到的包所计算出的校验值,如果七八行中的计算结果不能包含第五行的校验值,就会报错
请注意,不同的错误原因产生的错误信息也会不同,但是句式是一样的,不同的错误信息将对应不同的解决方案
在查阅相关资料时,有人提到npm5将哈希算法从SHA-1换成了SHA-512,导致原先npm4创建的全局缓存中的包全部无法校验通过,这种条件情境下,错误信息是
注意got后面没有sha-1的版本。这个问题在更新的npm上不存在,因为更新的npm会同时产生两种算法的校验值供校验,提供向下兼容
解决方法也比较简单,尝试执行下列指令,如果个修复缓存不行,就执行第二个清空缓存,重新创建即可
同一个包在不同仓库中有不同的内容,这在使用私有仓库时会比较常见,很多公司会选则在私有仓库上传带源码的版本,公共仓库上传编译好的版本。这里我们设同一个包在淘宝镜像和私有仓库中有不同版本,校验码也不同,则在以下场景下会产生错误:
这种情况的典型现象是,错误信息中,校验算法能够重合,但是校验结果不同,你Vue CLI提供了将Vue项目打包成库的命令,文档地址 可以拿着wanted后面的校验值去lock文件中搜索,从而确定是哪个包出了问题,然后比对不同仓库中该包的内容是否不同,如果不同,就可以确认是仓库不同导致的问题。
修复的方法也比较简单,如果是同一台电脑切换仓库导致的问题,你可以选择切回原来的仓库,或删除lock文件用新仓库的数据重建lock。如果是多台电脑仓库不同的问题,则需要统一使用的仓库,并将换过仓库的电脑上的全局缓存清除,用新仓库重建缓存
你近没有干奇怪的事情,没有切换仓库,lock也没人动过,但是用install重建依赖时就是不行,则有可能缓存和lock文件中至少有一个抽风了,的解决办法即按种中的方法修复或清空缓存,如果还不行,就只能删除lock,用install直接重建了,但删除lock会导致依赖版本改变,需谨慎作
如何正确使用node.js命令行工具
这次给大家带来如何正确使用node.js 命令行工具,如何使用node.js 命令行工具的注意事项有哪些,下面就是实战案例,一起来看一下。
一. 先了解一下package.json
每个项目的根目录都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件
{"name": "vue-cli",
"version": "2.9.3",
"description": "A CLI for scaffolding Vue.js projects.",
"preferGlobal": true,
"bin": {
"vue-init": "bin/vue-init",
"vue-list": "bin/vue-list"
"reitory": {
"type": "",
"": ""
"keywords": [
],
"author": "litongqian",
"lnse": "MIT",
"bugs": {
"": ""
"scripts": {
"test": "npm run lint && npm run e2e",
"start": "node index.js"
"dependencies": {
"async": "^2.4.0",
"chalk": "^2.1.0",
"devDependencies": {
"chai": "^4.1.2",
"eslint": "^3.19.0",
"engines": {
"node": ">=6.0.0"
}}1. 其中scripts字段
指定了运行脚本命令的npm命令行缩写,比如start指定了运行 npm run start 时,所要执行的命令。
bin项用来指定各个内部命令对应的可执行文件的位置
"bin": {
"vue-init": "bin/vue-init",
"vue-list": "bin/vue-list"
},上面代码指定, vue 命令对应的可执行文件为 bin 子目录下的 vue 。
3. npm link
npm link 就能起到这个作用,会自动建立这个符号链接。
请设想这样一个场景,你开发了一个模块 myModule ,目录为 src/myModule ,你自己的项目 myProject 要用到这个模块,项目目录为 src/myProject 。首先,在模块目录( src/myModule )下运行 npm link 命令。
src/myModule$ npm link上面的命令会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是 package.json 文件中指定的模块名。
/path/to/global/node_modules/myModule -> src/myModule这个时候,已经可以全局调用 myModule 模块了。但是,如果我们要让这个模块安装在项目内,还要进行下面的步骤。
切换到项目目录,再次运行 npm link 命令,并指定模块名。
代码如下:
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule
然后,就可以在你的项目中,加载该模块了。
src/myProject$ npm unlink myModule二. 可执行脚本其中 name 不能在 npm 上已经存在, private 必须设置为 false ,否则发布会失败, main 指定的是 import 我们的库时默认导入的文件
写一个简单的脚本hello
$ mkdir hello #创建一个文件夹
$ cd hello && touch hello #创建命令文件
console.log('hello world');文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。
打开 /usr/bin/env,可以查看到PATH,作系统通过路径找到node
$ chmod 755 hello
$./hello
如果想把 hello 前面的路径去除,可以将 hello 的路径加入环境变量 PATH。但是,另一种更好的做法,是在当前目录下新建 package.json ,写入下面的内容。
{"name": "hello",
"bin": {
"hello": "./hello"
}}然后执行 npm link 命令。不明白的看上面
$ npm link
三.命令行参数
命令行参数可以用系统变量 process.argv 获取。
修改hello脚本
console.log('hello ', process.argv);其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:
$ hello a b c
# process.argv的值为[ '/usr/local/bin/node', '/usr/local/bin/hello', 'a', 'b', 'c' ]
脚本可以通过 child_process 模块新建子进程,从而执行 Unix 系统命令,修改hello
exec 方法用于执行bash命令, exec 方法多可以接受两个参数,个参数是所要执行的shell命令,第二个参数是回调函数,该函数接受三个参数,分别是发生的错误、标准输出的显示结果、标准错误的显示结果。
var name = process.argv[2];
执行后会产生一个全局的映射关系,就可以全局使用hello命令了var child = exec('echo hello ' + name, function(err, stdout, stderr) {
if (err) throw err;
console.log(stdout);
如果我们想查看所有文件,修改hello
var name = process.argv[2];
var child = exec(name, function(err, stdout, stderr) {
if (err) throw err;
console.log(stdout);
});执行$ hello ls
hello目录下有三个文件
npm install --se shelljs然后,改写脚本。
var name = process.argv[2];
var shell = require("shelljs");
shell.exec("echo hello " + name);五、yargs 模块
$ npm install --se yargsyargs 模块提供 argv 对象,用来读取命令行参数。请看改写后的 hello 。
var argv = require('yanpm ERR! network This is most likely not a problem with npm itselfrgs').argv;
console.log('hello ', argv.name);使用时,下面两种用法都可以。
$ hello --name=tom
hello tom
hello tom也就是说,process.argv 的原始返回值如下。
$ node hello --name=tom
[ 'node',
'/usr/local/bin/hell',
'--name=tom' ]yargs 可以上面的结果改为一个对象,每个参数项就是一个键值对。
通过npm publish进行发布,前提是有npm帐号。如何作可以查看npm 文档。
本文是通过原生node.js来开发命令工具,而vue-cli是采用commander.js来简化命令工具开发,
了解了执行流程,去学习对应的模块,就很好知道原理了!,本文抛个砖头
:有时我们用到的命令行不是全局安装的,而是本地安装的
1. package.json bin字段
bin项用来指定各个内部命令对应的可执行文件的位置。
"name":"someTool",
"bin": {
"someTool": "./bin/someTool.js"
}上面代码指定,someTool 命令对应的可执行文件为 bin 子目录下的 someTool.js。
当一个项目依赖上面的someTool工具时,同时只是本地安装
"devDependencies": {
"someTool": "latest"
"scripts": {
start: 'someTool build' //等同于start: './node_modules/someTool/someTool.js build'
}}npm会寻找这个文件,在 node_modules/.bin/ 目录下建立符号链接。在上面的例子中,someTool.js会建立符号链接 npm_modules/.bin/someTool 。由于 node_modules/.bin/ 目录会在运行时加入系统的PATH变量,因此在运行npm时,就可以不带路径,直接通过命令来调用这些脚本。
因此,像上面这样的写法可以采用简写。
scripts: {
start: './node_modules/someTool/someTool.js build'
}// 简写为
scripts: {
start: 'someTool build'
}所有 node_modules/.bin/ 目录下的命令,都可以用 npm run [命令] 的格式运行。在命令行下,键入 npm run ,然后按tab键,就会显示所有可以使用的命令。
1. npm run
上面代码中, scripts 字段指定了两项命令 start ,输入 npm run-script start 或者 npm run start ,就会执行 someTool build 。 npm run 是 npm run-script 的缩写,一般都使用前者,但是后者可以更好地反应这个命令的本质。
npm run 命令会自动在环境变量 $PATH 添加 node_modules/.bin 目录,所以 scripts 字段里面调用命令时不用加上路径,这就避免了全局安装NPM模块。
npm run 如果不加任何参数,直接运行,会列出 package.json 里面所有可以执行的脚本命令。
npm内置了两个命令简写, npm test 等同于执行 npm run test , npm start 等同于执行 npm run start 。
npm run 会创建一个Shell,执行指定的命令,并临时将 node_modules/.bin 加入PATH变量,这意味着本地模块可以直接运行。
举例来说,你执行ESLint的安装命令。
$ npm i eslint --se-dev运行上面的命令以后,会产生两个结果。首先,ESLint被安装到当前目录的 node_modules 子目录;其次, node_modules/.bin 目录会生成一个符号链接 node_modules/.bin/eslint ,指向ESLint模块的可执行脚本。
然后,你就可以在 package.json 的 script 属性里面,不带路径的引用 eslint 这个脚本。
{"name": "Test Project",
"devDependencies": {
"eslint": "^1.10.3"
"scripts": {
"lint": "eslint ."
}}等到运行 npm run lint 的时候,它会自动执行 ./node_modules/.bin/eslint . 。
如果直接运行 npm run 不给出任何参数,就会列出 scripts 属性下所有命令。
$ npm run
Available scripts in the user-serv package:
lint
jshint .js
test
mocha test/相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
阅读:
React怎样在react-router路由实现登陆验证控制
Angular路由内路由守卫该如何使用
如何将npm作为构建工具使用_html/css_WEB-ITnose
"homepage": "",上个月,我在这篇文章《为什么要停止使用 Grunt 和 Gulp》中建议大家使用 npm 作为替代方案,npm 的 scripts 配置可以实现这些构建工具的所有功能,而且更简洁、更优雅和较少的模块依赖和维护开销。本文稿大概有 6000 字,深入讲解了如何将 npm 作为替代方案,但那篇文章主要在表达我的观点,而不是作为一篇教程。然而,读者的反馈却很强烈,许多读者告诉我 npm 并不能完全实现这些构建工具提供的特性,甚至有的读者直接给我一个 Gruntfile,然后反问我:“怎么用 npm 来实现这样的构建方案”?所以我决定进一步更新本文,将其作为一个新手入门教程,主要分享如何使用 npm 来完成一些常见的构建任务。
npm 是一个很好的工具,提供了一些奇特的功能,也是 NodeJS 的核心,包括我在内的很多人每天都在使用 npm,事实上在我的 Bash 历史记录中,npm 的使用频率仅次于 git。npm 更新也很快,旨在使 npm 成为一个强大的模块管理工具。而且,npm 有一个功能子集,可以通过运行一些任务来维护模块的生命周期,换句话说,它也是一个强大的构建工具。
scripts 配置 首先,我们需要搞清楚如何使用 npm 来管理构建脚本。作为核心命令之一的 npm run-script 命令(简称 npm run )可以从 package.json 中解析出 scripts 对象,然后将该对象的键作为 npm run 的个参数,它会在作系统的默认终端中执行该键对应的命令,请看下面的 package.json 文件:
{ "name": "myproject", "devDependencies": { "jshint": "latest", "browserify": "l&& 连续执行多个命令,前面的命令执行成功后才执行后面的命令 & 连续执行多个命令,不管前面命令执行成功没有,后面的命令将继续执行使命令从文件读入> 把命令的输出重定向到文件中 | 把命令的输出重定向到下一个命令 的问题在于,某些命令的命名不同(cp 和 Windows 中的 COPY)和变量的引用方式(Windows 中使用 % 引用变量,而 Bash 却是使用 $)。但这些问题都是可以解的:atest", "mocha": "latest" }, "scripts": { "lint": "jshint .js", "test": "mocha test/" }}
如果运行 npm run lint,npm 将在终端中执行 jshint .js,如果运行 npm run test,npm 将在终端中执行 mocha test/。执行 npm run xxx 时会将 node_modules/.bin 加入终端的 PATH 环境变量中,这样你就可以直接运行那些作为依赖安装的二进制模块,也就是说你不需要 "./node_modules/.bin/jshint .js" 或 "$(npm bin)/jshint .js" 这样来指定命令的路径。如果执行不带参数的 npm run 命令,它将列举出目前可执行的命令:
Available scripts in the user-serv package: lint jshint .js test mocha test/
快捷命令 npm 为一些命令提供了快捷方式:npm test,npm start 和 npm stop,例如 npm test 就是 npm run test 的快捷命令,快捷命令存在的原因有二:
这些是大多数项目都将使用的通用任务,所以不必每次都需要输入如此之多字符。 更重要的是,这为测试、启动和停止模块提供了对应的标准接口。一些持续集成工具(比如 Tris)就充分利用了这一特性,将 npm test 作为 NodeJS 模块的默认命令。这也可以使开发者加入一个新项目更加容易,他们不需要阅读文档就知道可以运行像 npm test 这样的命令。钩子 另一个炫酷的特性是,可以在 scripts 中为任何可执行的命令指定 pre- 和 t- 钩子。例如,当运行 npm run lint 时,即便是没有在 scripts 中定义对应的 pre- 命令,npm 也会首先执行 npm run prelint,接着才是 npm run lint,是 npm run tlint。
这个规则适用于所有命令,npm test 也一样(npm run pretest,npm run test,npm run ttest)。并且这些命令可以感知 exit-code,也就是说如果 pretest 命令退出时返回了非零的 exit-code,那么后续的 test 和 ttest 命令都不会继续执行。需要注意的是钩子不能嵌套,比如 prepretest 这样的命令将被忽略。
npm 也为一些内置命令(install,uninstall,publish 和 update)提供了钩子,用户不能重写这些内置命令的行为,但可以通过钩子来影响这些命令的行为:
"scripts": { "lint": "jshint .js", "build": "browserify index.js > myproject.min.js", "test": "mocha test/", "prepublish": "npm run build # also runs npm run prebuild", "prebuild": "npm run test # also runs npm run pretest", "pretest": "npm run lint" }
传递参数 npm 2.0.0 之后可以为命令传递参数,请看下面例子:
"scripts": { "test": "mocha test/", "test:xunit": "npm run test -- --reporter xunit" }
我们可以直接运行 npm run test 也就是 mocha test/,我们还可以在命令后面加上 -- 来传递自定义的参数,比如 npm run test -- anothertest.js 将运行 mocha test/ anothertest.js,一个更实用的例子是 npm run test -- --grep parser,将运行 mocha test/ --grep parser。这可以让我们将一些命令组合起来使用,并提供一些高级配置项。
自定义变量 可以在 package.json 文件中的 config 中指定任意数量的变量,然后我们可以在 scripts 中像使用环境变量一样来使用这些变量:
"name": "fooproject", "config": { "reporter": "xunit" }, "scripts": { "test": "mocha test/ --reporter $npm_package_config_reporter", "test:dev": "npm run test --fooproject:reporter=spec" }
在 config 中的所有属性都将加上 npm_package_config_ 前缀暴露到环境变量中,在上面的 config 对象中有一个值为 xunit 的 reporter 属性,所以运行 npm run test 时,将执行 mocha test/ --reporter xunit。
可以通过如下两种方式来覆盖变量的值:
和上例中的 test:dev 一样,可以通过 --fooproject:reporter=spec 将 reporter 变量的值指定为 spec。具体使用时,你需要将 fooproject 替换为你自己的项目名,同时将 reporter 替换为你需要替换的变量名。 通过用户配置来覆盖,通过运行 npm config set fooproject:reporter spec 将会在 ~/.npmrc 文件中添加 fooproject:reporter=spec 项,运行 npm 时将动态读取这些配置并且替换 npm_package_config_reporter 变量的值,这意味着运行 npm run test 将执行 mocha test/ --reporter spec。可以通过运行 npm config delete fooproject:reporter 来删除这些个人配置项。比较优雅的方式是在 package.json 文件中为变量指定一些默认值,同时用户可以在 ~/.npmrc 文件中自定义某些变量的值。老实说,我并不喜欢对这种定义和使用变量的方式,而且还有一个缺陷,那就是在 Windows 中引用变量是通过 % 加变量名,如果 scripts 中定义的是 NodeJS 脚本,并不会有什么问题,然而对于 shell 脚本却不兼容。
Windows 的问题 继续深入之前,我们先聊一个题外话。npm 依赖作系统的 shel发布时遇到错误时可能是以下原因导致的:l 作为其脚本运行的环境,Linux、Solaris、BSD 和 Mac OSX 都内置了 Bash 作为他们的默认 shell,而 Windows 却没有,在 Windows 中,npm 将使用 Windows 的命令行工具作为其运行环境。
但这也算不上什么大问题,Bash 和 Windows 中的许多语法都一样:
对于某些特殊的命令,我们可以不使用系统内置的命令,而是使用具有相同功能的 npm 模块。例如我们可以使用 rimraf 这个模块来替代内置的 rm 命令。 只使用那些跨平台兼容的语法,即便是仅仅使用 &&,>,| 和 这些语法就可以完成很多令人惊讶的功能。环境变量的引用只是冰山一角。如何替换构建工具 现在我们回归正题,如果我们想要替换 Grunt 和 Gulp 这样的构建工具,我们需要实现这些构建工具及其插件的对等功能。我从各种项目和上篇文章的评论中收集了一些的构建任务,下面我将演示如何通过 npm 来实现这些任务。
多文件处理 在上一篇文章的评论中有几个人提到:构建工具的一个优势是可以使用 .js, .min.css 或 assets// 这样的 globs 语法来进行多文件处理。事实上这个特性的灵感来源于 Bash 中的 glob 命令。 Shell 会将命令参数(如 .js)中的星号解析为通配符,使用连续两个星号表示跨目录递归查询。如果你正在使用 Mac 或 Linux,你可以在终端中玩一下,比如 ls .js。
现在的问题是,Windows 的命令行并不支持该特性。新运的是,Windows 会将参数(如 .js)逐字完整地传递给命令,这样就可以为 Windows 安装对应的兼容库就可以实现 glob 语法。在 npm 中有两个的 glob 包 minimatch 和 glob,已经被 1500 多个项目依赖,包括 JSHint,JSCS,Mocha,Jade,Stylus,Node-Sass?等等,而且这个数量还在增长。
"devDependencies": { "jshint": "latest"},"scripts": { "lint": "jshint .js"}
执行多任务 在 Grunt 和 Gulp 中可以将一些任务组合起来成为一个新的命令,尤其是在构建或测试时非常实用。在 npm 中有两种方式可以解这个问题:一是通过 pre- 和 t- 钩子,如果在执行某个任务之前需要执行某个任务(如压缩之前合并文件),这是个不错的选择;另外你还可以实用 && 这个命令连接符:
"devDependencies": { "jshint": "latest", "stylus": "latest", "browserify": "latest"},"scripts": { "lint": "jshint ", "build:css": "stylus assets/styles/main.styl > dist/main.css", "build:js": "browserify assets/scripts/main.js > dist/main.js", "build": "npm run build:css && npm run build:js", "prebuild:js": "npm run lint"}
上例中 build 包含了 build:css 和 build:js 两个任务,并且在执行 build:js 前将先执行 lint 任务。执行 build:css 或 build:js 也是可行的,单独执行 build:js 前也会先执行 lint。所以我们可以像这样来组合我们的任务,并且这是 Windows 兼容的。
使用数据流 Gulp 一个的特性是使用流将一个任务的输出 pipe 到下一个任务(Grunt 需要频繁地读取和保存文件)。在 Bash 和 Windows 的命令行中都有 | 这个管道作符,可以用来将一个命令的输出(stdout)作为下一个命令的输入(stdin)。比方说对一个 CSS 文件,你想先通过 Autoprefixer 处理,然后 CSSMin,保存到文件:
"devDependencies": { "autoprefixer": "latest", "csin": "latest"},"scripts": { "build:css": "autoprefixer -b 'last 2 versions' dist/main.css"}
就像你看到的那样,首先通过 autoprefixer 为我们的 CSS 添加浏览器厂商前缀,然后将其输出 pipe 到 csin 来压缩我们的 CSS,将整个输出保存到 dist/main.css 文件。绝大多数工具都支持 stdin 和 stdout,而且上述代码可以在 Windows,Mac 和 Linux 平台下完美兼容。
版本号 版本号管理是 Grunt 和 Gulp 中的一个常见任务,可以方便地将 package.json 中的版本号加一,为项目打 Tag 和 Commit。
还可以自定义这几个命令的行为。如果不想为项目打 Tag,你可以在命令后面加上 --git-tag-version=false,或者通过 npm config set git-tag-version false 将其设置为默认项。如果想自定义提交信息呢?可以这样 npm version patch -m "Bumped to %s",或直接设置为默认项 npm config set message "Bumped to %s"。甚至可以通过 --sign-git-tag=true 为 Tag 签名,也可以通过 npm config set sign-git-tag true 将其设置为默认项。
清理 很多构建工具都会有一个 clean 任务,用来清理构建过程或构建后生成的文件,在 Bash 中自带了一个清理命令 rm,在命令后面加上 -r 参数可以递归删除目录。这个命令再简单不过了:
如果想兼容 Windows 可以使用 rimraf 这个平台无关的兼容模块:
"devDependencies": { "rimraf": "latest"},"scripts": { "clean": "rimraf dist"}
文件名 Hash 化 在 Grunt 和 Gulp 分别有 grunt-hash 和 gulp-hash 两个插件,用来根据文件的内容生成一个 hash 化后的文件名。要用已有的命令来实现这个功能还是比较难,我搜索了 npm 模块,也没有找到具有相同功能的模块,所以我自己实现了一个 _ hashmark。该支持流作,可以作为某些 Grunt/Gulp 插件的依赖项。继续之前的例子,我们可以将构建结果 pipe 到一个具有 hash 值文件名的文件中:
"devDependencies": { "autoprefixer": "latest", "csin": "latest"},"scripts": { "build:css": "autoprefixer -b '> 5%' < assets/styles/main.css | csin | hashmark -l 8 'dist/main.#.css'"}
现在执行 build:css 任务将得到一个类似 dist/main.3ecfca12.css 这样的文件。
好吧,其实很多工具自身就提供了这个选项,可以用于复杂的文件系统。比如 Mocha 就提供了 -w 选项,还有 Stylus、Node-Sass、Jade 和 Karma 等等。你可以这样使用:
"devDependencies": { "mocha": "latest", "stylus": "latest"},"scripts": { "test": "mocha test/", "test:watch": "npm run test -- -w", "css": "stylus assets/styles/main.styl > dist/main.css", "css:watch": "npm run css -- -w"}
"devDependencies": { "stylus": "latest", "jade": "latest", "browserify": "latest", "watch": "latest",},"scripts": { "build:js": "browserify assets/scripts/main.js > dist/main.js", "build:css": "stylus assets/styles/main.styl > dist/main.css", "build:html": "jade assets/html/index.jade > dist/index.html", "build": "npm run build:js && npm run build:css && npm run build:html", "build:watch": "watch 'npm run build' .",}
就是这么简单,仅仅 13 行配置就可以监视整个项目文件,当任何文件改变时就自动执行构建 HTML、CSS 和 JS 的任务,直接执行 npm run build:watch 就可以开始无痛开发了。使用一个我写的模块 Parallelshell,用于并发执行多个命令,我们还可以做一些优化:
运行 npm run build:watch 时将通过 Parallelshell 分别运行的监视任务,如果只有 CSS 文件发生了变化,那么将只执行 CSS 构建任务。Parallelshell 将每个任务的输出(stdout 和 stderr)连接到主进程,并了 exitCode 来确保构建任务的日志输出(这与 & 这个命令连接符不同)。
LiveReload LiveReload 也是一个很受欢迎的特性:当文件变化时自动刷新浏览器中的页面,live-reload 这个 npm 模块可以实现这个功能,看下面例子:
执行 npm run livereload 后,dist/ 目录下的任何改变都将通知到你访问的 HTML 页面,并触发页面自动刷新。
自定义脚本 那么如果一个模块并没有提供相应的命令行工具,如 ficon,该怎么办呢?我们可以自己写一段 JaScript 脚本来执行相应的功能,这也正是 Grunt/Gulp 插件所做的事情,还可以给模块维护者提交 PullRequest 让他们提供一个命令行工具:
// scripts/ficon.jsvar ficons = require('ficons'); var path = require('path'); ficons({ source: pat
发布npm包时遇到的一些坑
$ hello --name tom我感觉发布过程中的坑让我踩的不多了...在这里记录一下
src/myProject$ npm link myModule上面命令等同于生成了本地模块的符号链接。先简单记录一下发布流程
初始化包
登录npm
发"devDependencies": { "live-reload": "latest",},"scripts": { "livereload": "live-reload --port 90 dist/",}布包
接下来就是遇到的问题了,每个问题都包含报错信息,请善用 ctrl + f 搜索,下文报错中涉及到自己包名的我都替换为了 your-package 。
这个是注册后没有验证邮箱,登录自己邮箱找到对应的邮件确认就好了。注意别选错了,注册 npm 时会发给你两个邮件,我当时就是眼瞎没有看到第二个。如果验证邮件过期的话登录自己的 npm 主页重新发一个就好了。
你的包和别人的包重名了,npm 里的包不允许重名,所以去 npm 搜一下,改个没人用的名字就可以了。
这个是你的源设置成第三方源的时候才有可能发生,比如设置了淘宝源就 可能 会导致该问题。只要把源改回默认的就可以了,如下:
如果npm上已经有了不少和你的包名类似的包,就会出现这个问题,在 package.json 中修改你的包名就可以了
这个当你的包名为 @your-name/your-package 时才会出现,原因是当包名以 @your-name 开头时, npm publish 会默认发布为私有包,但是 npm 的私有包需要付费,所以需要添加如下参数进行发布:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。