当前位置: 首页 > 编程日记 > 正文

安装node和spm过程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

安装nodejs

官网下载nodejs我下的是v0.10.33版本,安装到d:\nodejs下。

1.新建目录d:\nodejs,在其中建立node_cache、node_global、node_modules三个目录。
2,将C:\Users\Administrator\AppData\Roaming\npm目录下的文件copy到d:\nodejs\node_global。
3,将C:\Users\Administrator\AppData\Roaming\npm_cache目录下的文件copy到d:\nodejs\node_cache。
4,修改系统变量path=d:\nodejs;d:\js\nodejs\node_global。
5,修改系统变量node_path=d:\nodejs\node_global\node_modules。
6,开启cmd,执行:
npm config set prefix "d:\nodejs\node_global"
npm config set cache "d:\nodejs\node_cache"

windows上运行npm Error: ENOENT, stat 'C:\Users\

windows上运行npm 报Error: ENOENT, stat 'C:\Users\PC111\AppData\Roaming\npm' 错误解决方法

        在windows上装好了node.js 版本为:v0.10.30 。由于不是用的默认安装路径,需要在 报错的路径下 建个名为  npm的文件 ,不要带后缀名哦。报错路径为: C:\Users\“你用户名”\AppData\Roaming\   这个路径下建个npm文件即可正常使用npm 命令了!


优化完毕。


新开启cmd,执行node -v,npm -v,node正常。
查看环境变量:npm config list同4,5设置的一样 


优化成功。


使用npm进行安装时,采用-g指令,会安装到global目录中去。


以上步骤完成后,实际上就是完成了nodejs的绿色化,可随意拷贝到其他电脑中,修改环境变量后就可以用了。


接下来安装express
npm install express -g
可以通过express myapp进行相关测试,在这里就不描述了。


装sp m

1.npm install spm -g
2.spm help 你会看到所有的命令。我们主要用的命令就是
3.spm build

关于包管理

一旦进入到使用spm的阶段,事情就会一下子复杂起来。毕竟前端开发有自身的特征,模块化的方法从后端进入前端,肯定要有所变化。

首先,spm依赖node.js和npm,而且环境里必须有一个2.6+的python。这一步不算太难,网上大把教程,按步骤就能搞定。

安装好spm之后,就可以将模块的配置、打包、部署都交给它来实现。

比如想要用spm管理一个模块,最好在创建模块的时候,用spm初始化一下,这样会比较方便。步骤如下:

1、创建一个模块专用的目录

2、在目录下使用spm init命令

3、spm会要求你输入一些基本设置信息,然后会自动在目录下创建一些模块的基础文件

整个过程截图如下:

如图所示,输入spm init时,接到的第一个提示是选择初始化模块的类型,一个是arale,一个是alice。好吧,直到这时我才发现,spm的init操作要依赖一个叫源的东西。默认源指向的是官方提供的服务器,服务器上有两个初始化模板可供选择,arale是js模块的模板,alice是css模块的模板,它们都是支付宝的开源项目。

如果运气不好,在运行init的时候可能会遇到这种错误信息:

[WARN] 没有发现源信息  
[ERROR] Caught exception: TypeError: Cannot call method 'filter' of undefined 

不仅仅是init,其他时候也可能出现类似的情况,比如在build的时候出现这种错误:

[ERROR] find gallery/jquery/1.8.3/jquery error!  
[WARN] Cannot find module (gallery/jquery/1.8.3/jquery) from sources!  
[ERROR] find gallery/highcharts/2.3.5/highcharts error!  
[WARN] Cannot find module (gallery/highcharts/2.3.5/highcharts) from sources!  
[ERROR] find gallery/bootstrap/2.3.0/js/bootstrap error!  
[WARN] Cannot find module (gallery/bootstrap/2.3.0/js/bootstrap) from sources!  
[ERROR] find gallery/jquery-tools/cookie/1.0.0/cookie error!  
[WARN] Cannot find module (gallery/jquery-tools/cookie/1.0.0/cookie) from sources! 

所有这些错误,实际原因只有一个:官方提供的源服务不稳定。最好的解决方案是自己搭一个源。建议还是自己搭一个比较安心。具体方法可以到github上找spm的项目,里面有介绍,这里就不多说了。

回到刚才spm init操作,通过spm默认源初始化的模块,目录里面会自动创建若干文件,实际上最核心的文件只有两个,一个是模块根目录下的package.json文件,另一个是src目录下的something.js文件(文件名根据初始化时的输入生成)。

这时如果运行一下spm build,这个命令就会根据package.json里的配置信息,对src/something.js文件进行打包。由于没有修改package.json,所以spm会直接在模块目录下生成一个dist目录,并在里面创建两个打包好的模块文件:something.js(压缩文件) 和 something-debug.js(未压缩文件)。

这就是spm最基本的操作方法,通过修改package.json,可以实现更定制化的打包方式,比如,如果a.js里面引用了b.js和c.js两个模块文件,可以在打包a.js的时候,将b.js和c.js都压缩到a.js里。这时问题就出现了,什么时候采用这种压缩,什么时候不采用?这个问题看似简单,但是非常重要。在实际项目里,模块数量可能会有几十个,而且会有很多的依赖,这时候就要仔细设计一下模块之间的逻辑关系,否则,复杂的模块依赖,会让一切倒退回模块化以前的状态。

模块层级

spm对sea.js提供了很好的支持,但它存在局限性,比如针对单个模块的管理会比较便捷,但是在管理整个项目的众多模块时,使用spm就变得非常繁琐,所以,需要对模块进行分层,区分每一层的目标和使用方法,最简单地方法是分成三个层级:

base层:

这一层一般只有一个模块,该模块负责载入全局共享的一些类库和控件,比如jQuery,ember,es5-safe等。

module层:

这一层是一些细分的模块,比如datepicker、validate、raphael,这些模块都只负责某一个功能,或者只适用于某些特定的场景,它们会被一些页面用到,但没必要让全部页面都引用,所以就尽量分拆。

app层:

这一层的每个模块,都对应到专门的一个页面。它的脚本是为该页面写的,并且根据需要,对module层的模块进行引用。

需要注意的是,在开发过程中,尽量不针对某个模块进行单独打包,比如base层,看起来都是一些通用类库,很稳定,不会经常修改,不如提前打包压缩一个稳定版本。可是,base并不一定像我们想的一样稳定,有时候我们会将一些module层的模块或者方法抽出来,放到base层,这种调整的频率并不低。而在module层和app层,这种调整更是随时都在发生,有些是工程师自己做的调整,有些可能是来自交互、视觉或者产品的调整,对任何模块的提前固化,都可能加重修改时的负担。所以,打包应该在一些关键点上进行,比如提测,比如上线,这时,base层用到的所有全局共享的类库,都压缩到一个base.js文件里,作为一个独立的全局模块使用。app层的各个模块都分别输出,它们用到的module层的模块,都要压缩到自己的文件里,以便减少js载入的文件数量。而module层的模块都已经被压缩到需要出现的地方,所以不再需要压缩输出。

package.json的设置

对模块进行打包处理时,spm会检查模块的package.json,根据里面的配置信息进行打包。问题是,在实际项目里,模块的数量可能会有十几个甚至几十个。如果对每个模块都进行单独处理,会增加非常大的工作量,虽然在package.json里可以标注父级配置,让多个模块共享某些设置,但是这种处理方式有时候可能会适得其反。试想一下,如果我们发现父级配置的一些项目并不通用,应该分拆到适用的模块中,或者众多模块中的配置内容,应该合并到父级配置当中,都不是能够轻松完成的。所以,为了保证package.json的配置工作更为便捷,不如就把整个项目视为一个模块。按照这种想法,目录结构大概可以设为下面这样:

static/js/base.jsapp1.jsapp2.jsapp3.js...js-dev/libs/jquery.jsember.js…modules/m1.jsm2.js...src/base.jsapp1.jsapp2.jsapp3.js…package.json

只保留一个package.json,对全局进行配置,打包的时候,libs目录下的全局脚本都会被压缩到base.js里,modules目录下的模块也不直接输出,它们被哪个app引用,就被压缩到哪个app里。这样设置,开发过程在js-dev目录下进行,需要打包时,通过唯一的配置文件,将base.js和各个app文件输出到js目录下,然后只要在页面加载的地方改一下路径,就可以完成切换。当然这只是一个大概思路,实际应用中还要处理很多问题,比如哪些内容应该放在app层级,哪些应该放在module层级,以及如何结合git或者svn进行代码管理,如何在页面中设置引用,等等等等,都比较麻烦。而且,这一思路也并非通用,不同项目有自己的特征,需要使用不同的方法处理。所以说采用sea.js在带来很多好处的同时,也会增加很多负担,两相权衡,利大就用,弊大则弃。现在的js开发已经变得越来越复杂,如果一项技术不能让你的开发变得更便捷,那最好别用。







转载于:https://my.oschina.net/bigyuan/blog/339280

相关文章:

经典网络LeNet-5介绍及代码测试(Caffe, MNIST, C++)

LeNet-5:包含7个层(layer),如下图所示:输入层没有计算在内,输入图像大小为32*32*1,是针对灰度图进行训练和预测的。论文名字为” Gradient-Based Learning Applied to Document Recognition”,可以直接从ht…

根据经纬度获取用户当前位置信息

根据上篇文章获取的经纬度获取用户当前的位置信息 //获取用户所在位置信息ADDRESS func getUserAddress() { let latitude : CLLocationDegrees LATITUDES! let longitude : CLLocationDegrees LONGITUDES! print("latitude:\(latitude)") print("longitude…

刷了几千道算法题,我私藏的刷题网站都在这里了

作者 | Rocky0429 来源 | Python空间(ID: Devtogether)遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活...然而我是谁,我可是死狗中的战斗鸡,智力不够…

js实现点击li标签弹出其索引值

据说这是一道笔试题&#xff0c;以下是代码&#xff0c;没什么要文字叙述的&#xff0c;就是点击哪个<li>弹出哪个<li>的索引值即可&#xff1a; <html> <head> <style> li{width:50px;height:30px;margin:5px;float:left;text-align: center;li…

定时器开启和关闭

写程序时遇见了定时器&#xff0c;需要写入数据库用户的经纬 &#xff0c;还要读取&#xff0c;写好之后发现很费电 总结原因&#xff1a; 1&#xff1a;地图定位耗电&#xff08;这个根据程序要求&#xff0c;不能关闭&#xff0c;需要实时定位&#xff0c;很无奈&#xff…

一览群智胡健:在中国完全照搬Palantir模式,这不现实

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;神秘的硅谷大数据挖掘公司 Palantir 是国内众多创业公司看齐的标杆&#xff0c;其业务是为政府和金融领域的大客户提供数据分析服务&#xff0c;帮助客户作出判断&#xff0c;甚至“预知未来”&#xff0c;…

ImageNet图像数据集介绍

ImageNet图像数据集始于2009年&#xff0c;当时李飞飞教授等在CVPR2009上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文&#xff0c;之后就是基于ImageNet数据集的7届ImageNet挑战赛(2010年开始)&#xff0c;2017年后&#xff0c;ImageNet由Ka…

cocos2dx 场景的切换

我们知道cocos2dx中可以由多个场景组成&#xff0c;那么我是如何来切换场景的呢首先我们先新建一个新的场景类&#xff0c;我推荐的方式是&#xff0c;在你工程的目录中找到一个classes的文件夹&#xff0c;里面有AppDelegate.cpp和AppDelegate.h还有HelloWorldScene.cpp和Hell…

IOS 后台挂起程序 当程序到后台后,继续完成定位任务

// 当应用程序掉到后台时&#xff0c;执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 当一个 iOS 应用被送到后台,它的主线程会被暂停。你用 NSThread 的 detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。 我…

任正非:华为5G是瞎猫碰死老鼠

喜欢话糙理不糙的任正非&#xff0c;又飙金句。11月6日&#xff0c;在和彭博社记者对话时&#xff0c;谈到华为5G&#xff0c;他说&#xff1a;“回顾这个过程&#xff0c;我们也没有什么必胜的信心&#xff0c;有时候也是瞎猫碰上了死老鼠&#xff0c;刚好碰上世界是这个需求。…

网络文件系统(NFS)简介

网络文件系统(Network File System, NFS)是一种分布式文件系统协议&#xff0c;最初由Sun Microsystems公司开发&#xff0c;并于1984年发布。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。NFS和其他许多协议一样&#xff0c;是基于开放网络运算远…

JAVA Static方法与单例模式的理解

最近用sonar测评代码质量的时候&#xff0c;发现一个问题&#xff0c;工程中一些util类&#xff0c;以前写的static方法都提示最好用单例的方式进行改正。为此&#xff0c;我仔细想了想&#xff0c;发现还是很有道理的。这里谈谈我个人对static方法与单例模式的理解。所谓单例模…

程序员的自我修养--链接、装载与库笔记:目标文件里有什么

编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲&#xff0c;它是已经编译后的可执行文件格式&#xff0c;只是还没有经过链接的过程&#xff0c;其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的&#xff0c;只是跟真正的可执…

swift 中拨电话的实现

//MARK:_一键报警设置//MARK: - 弹出视图func createView() {var alertView : UIAlertView?alertView UIAlertView(title: "110", message: "", delegate: self, cancelButtonTitle: "取消", otherButtonTitles: "呼叫")alertView?…

T5,一个探索迁移学习边界的模型

作者 | Ajit Rajasekharan译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】10月&#xff0c;Google 在《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》这篇论文中提出了一个最新的预训练模型 T5&#xff…

【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 多人聊天室

本次实验利用TCP/IP, 语言环境为 C/C 利用套接字Socket编程&#xff0c;以及线程处理&#xff0c; 实现Server/CLient 之间多人的聊天系统的基本功能。 结果大致如&#xff1a; 下面贴上代码&#xff08;参考参考...) Server 部分&#xff1a; 1 /* TCPdtd.cpp - main, TCPdayt…

TeamViewer介绍:远程控制计算机

TeamViewer是一个可以远程控制计算机的程序&#xff0c;它也可以进行远程文件传输。TeamViewer支持的平台比较多&#xff0c;如Windows, Mac, Linux, ChromeOs, Android, iOS等&#xff0c;最新发布版本为14.x&#xff0c;它有个人免费和商业付费两种。只要对方告诉你他的TeamV…

PyTorch攻势凶猛,程序员正在抛弃TensorFlow?

来源 | The Gradient译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;自 2012 年深度学习重新获得重视以来&#xff0c;许多机器学习框架便争相成为研究人员和行业从业人员的新宠。从早期的学术成果 Caffe 和 Theano &#xff0c;到背靠庞大工业支持的 PyT…

swift 错误集合 ------持续更新中

从今天开始凡是在用swift中遇到的错误都会在本博客持续更新 便于自己学习和快速开发 2017.7.20 如果你的程序写的有进入后台的方法&#xff0c;例如我的博客中点击home进入后台持续定位的那篇文章&#xff0c;发信进入后台后定位没有按得定时器规定的时间走&#xff0c;这…

【转载】【贪心】各种覆盖问题

1、独立区间问题 在N个区间里找出最多的互不覆盖的区间 对结束点进行排序&#xff0c;然后从结束点最小的区间开始进行选择即可 2、覆盖区间问题 给一个大区间&#xff0c;再给出N个小区间&#xff0c;求出最少用多少个区间可以把大区间覆盖完 先选出开始的一个&#xff0c;然后…

使用Python3发送邮件测试代码

SMTP(Simple Mail Trasfer Protocol)即简单邮件传输协议&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;用它来控制信件的中转方式。Python3对SMTP的支持有smtplib和email两个模块&#xff0c;smtplib负责发送电子邮件&#xff0c; email负责组织邮件内…

swift 通知中心 进入后台多久会通知用户关闭此功能

//添加本地通知 func addLocalNotification() { //定义本地通知对象 let notification : UILocalNotification UILocalNotification() //设置调用时间 notification.fireDate NSDate.init(timeIntervalSinceNow: 1800.0)//通知触发的时间&#xff0c;10s以后 notification.…

Python之父退休,C语言之父与世长辞,各大编程语言创始人现状盘点

作者 | 年素清 编辑 | 伍杏玲 来源 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;从世界上第一台计算机(ENIAC) 于1946年2月在美国诞生至今的七十多年里&#xff0c;涌现出了许多优秀的计算机编程语言。程序员们在使用它们编写程序的时候&#xff0c;一定很好奇…

linux修正系统错误指令fsck和badblocks

fsck [-t文件系统][-ACay]装置名称-t 指定文件系统-A 扫描需要的装置-a 自动修复检查到有问题的扇区-y 与-a类似-C 在检查过程中&#xff0c;显示进度********************************************************** EXT2/EXT3额外选项功能&#xff1a;-f 强制检查-D 针对文件系…

Ubuntu定时任务crontab命令介绍

通过Linux上的crontab命令&#xff0c;我们可以在规定的间隔时间执行指定的系统指令或脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。 crontab默认在Ubuntu上是已经安装的&#xff0c;若未安装&#xff0c;则可执行以下命令进行安装&#xff1a; sudo …

swift 进入后台或者点击home键是程序进入后台后,持续定位

进入后台的方法 import UIKit UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate,CLLocationManagerDelegate { var locationManager : CLLocationManager? var window: UIWindow? var notificationDict NSDictionary() func applicationDidEnterBa…

求助:我有一辆机器人小车,怎么让它跑起来,还会避障、目标跟踪、路径规划?...

也许&#xff0c;你曾见过能灵活地绕开障碍物的它在桌子边缘“疯狂试探”的它它是谁&#xff1f;没错&#xff0c;它就是是英伟达推出的一款入门级人工智能小车——Jetbot &#xff0c;估计对机器人&#xff0c;尤其是对车械感兴趣的朋友们一定对它不陌生。组装完成后能够通过摄…

Python-常用字符串转换实例

当字符串是&#xff1a;\u4e2d\u56fd >>>s[\u4e2d\u56fd,\u6e05\u534e\u5927\u5b66]>>>strs[0].decode(unicode_escape) #.encode("EUC_KR")>>>print str 中国 当字符串是: >>>print unichr(19996) 东 ord()支持unicode&…

什么是静态UItableView

iOS开发UI篇—简单介绍静态单元格的使用 iOS开发UI篇—简单介绍静态单元格的使用 一、实现效果与说明 说明&#xff1a;观察上面的展示效果&#xff0c;可以发现整个界面是由一个tableview来展示的&#xff0c;上面的数据都是固定的&#xff0c;且几乎不会改变。 要完成上面的…

Python3中PyMongo使用举例

MongoDB是一个基于分布式文件存储的开源数据库&#xff0c;由C语言编写&#xff0c;与平台无关&#xff0c;旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库中功能最丰富&#xff0c;最像关…