V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sensui7
V2EX  ›  分享发现

前端坑: node-sass

  •  
  •   sensui7 · 2017-05-16 17:53:44 +08:00 · 16943 次点击
    这是一个创建于 2778 天前的主题,其中的信息可能已经有所发展或是发生改变。

    提起 node-sass, 很多人一把泪,. 之前用 npm, 我用 cnpm, 或者终端代理安装.

    这回环境换成 win+yarn,

    1. cmd 开代理我是不会 用了传说中的 node_sass/install.js 的变量, 指向 cnpm 包的地址, url 没问题, 死活提示 404.

    2. 于是还是开全局代理.

    3. build 时提示 python 找不到, 就在环境变量中, 你找不到 , 手工指定

    yarn config python2 c:\python2\python2.exe
    
    1. 最后, yarn 没有 rebulid, 有一个
    yarn install --force
    

    不够折腾的... 我想用 linux.

    22 条回复    2017-05-18 22:09:18 +08:00
    371657110
        1
    371657110  
       2017-05-16 17:58:31 +08:00   ❤️ 1
    SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
    一直用这个.没毛病
    sensui7
        2
    sensui7  
    OP
       2017-05-16 18:06:42 +08:00
    @371657110
    我没实验这个, 我用的
    set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ & node node_modules/node-sass..../install.js

    一直提示找不到
    371657110
        3
    371657110  
       2017-05-16 18:09:09 +08:00
    @sensui7 我是整一句打到 terminal 里面的..可以替换成 yarn..
    sensui7
        4
    sensui7  
    OP
       2017-05-16 18:19:52 +08:00
    @371657110 是的, 但我之前是给 node-sass 的 build 文件 install.js 指定的变量, 单独这样就不用下载包了.

    顺便补充一下, yarn config python2 c:\python2\python2.exe 加上-g
    cyio
        5
    cyio  
       2017-05-16 18:45:48 +08:00
    在 node-sass 安装上花的时间,想想就后悔,深坑,替代品太多了,能离多远离多远,自己绝不主动用
    SourceMan
        6
    SourceMan  
       2017-05-16 18:47:11 +08:00
    你用的 Windows 吧?
    smallpath
        7
    smallpath  
       2017-05-16 18:53:43 +08:00
    有机会安 node-gyp 的话, 你可以再经历一次更反人类的体验
    janecc
        8
    janecc  
       2017-05-16 19:23:27 +08:00
    直接 npm 走代理,没有压力
    sammo
        9
    sammo  
       2017-05-16 19:24:32 +08:00 via iPhone
    指定老版本即可
    arfaWong
        10
    arfaWong  
       2017-05-16 19:26:40 +08:00
    cnpm 用起来想想就怕 😑😑😑
    fhefh
        11
    fhefh  
       2017-05-16 19:42:02 +08:00
    昨天遇到过 我用 yarn 安装的就好了
    hxsf
        12
    hxsf  
       2017-05-16 19:54:35 +08:00   ❤️ 1
    1. 这不是 node 的问题

    2. 这只能怪墙

    3. node-sass 有 pre-build 好的,会从 github 拉,还是墙的问题

    4. 淘宝有 node-sass 的 pre-build 镜像

    5. node-sass 的源代码 中写到

    function getBinaryUrl() {
    var site = getArgument('--sass-binary-site') ||
    process.env.SASS_BINARY_SITE ||
    process.env.npm_config_sass_binary_site ||
    (pkg.nodeSassConfig && pkg.nodeSassConfig.binarySite) ||
    'https://github.com/sass/node-sass/releases/download';

    return [site, 'v' + pkg.version, getBinaryName()].join('/');
    }

    很容易就可以排除你为什么 404 的问题。比如 site 的末尾有 /的情况下,拼接出来的路径是不是会有两个 /,如果是,那两个 /会不会导致问题出现?

    node-gyp 在 windows 上需要 vs 这个比较麻烦,确实可以黑一把,什么时候支持 gcc 就好了。



    总结: 墙的问题。
    371657110
        13
    371657110  
       2017-05-18 09:39:29 +08:00
    如果没有历史原因.用 postcss 的 nextcss 挺好的.
    sensui7
        14
    sensui7  
    OP
       2017-05-18 16:20:27 +08:00
    @hxsf 你分析的很好, 但是都是我们知道的东西, 而且并不都是墙的问题, 最重要的是有解决办法吗?

    我主贴中贴的方法并不彻底, python2 的问题用 yarn config 解决不了, 还有 SASS_BINARY_SITE 的问题, 我已经找到了一劳永逸而且很简单的方法, 以后按 node-sass 和普通包一样了.

    不过感觉 v2 大神太多, 以后还是发在自己博客吧.
    hxsf
        15
    hxsf  
       2017-05-18 16:40:10 +08:00
    @sensui7 #14

    好,那请问,
    1. 你 2 楼中提到的 `node node_modules/node-sass..../install.js` 中,node_modules 中 node-sass 文件夹哪里来的,你使用别的工具下载完了放进去的?如果是,你有记得安装它的依赖么?我猜你说的 `一直提示找不到` 是找不到 node-sass/...install.js 所需要的依赖吧。

    2. 你 4 楼中提到的 `yarn config set python2 c:\python2\python2.exe` 又是什么操作?
    node-gyp 文档中明确提到了:
    如果你电脑中 python2 不在 path 中,请使用 `npm config set python /path/to/python2.7`
    config 的键是 python 不是 python2

    3. node-sass 因为是个需要 gyp 的模块,作者已经提供了 pre-build, 如果网络质量好的情况下,可以直接下载到编译好的,而无需进行本地的从源码构建

    4. 承认 node-gyp 在 window 环境下很难配置。

    5. 另外,cmd 不走 代理,不过 yarn/npm 可以配置代理:
    yarn config http-proxy=http://127.0.0.1:port
    yarn config https-proxy=http://127.0.0.1:port
    一句是 http 代理,一句是 https 代理。
    sensui7
        16
    sensui7  
    OP
       2017-05-18 17:26:21 +08:00
    @hxsf

    我严重怀疑你到底用 npm 或者 yarn 安装过 node-sass 吗? 你要是安装过就知道 install.js 是从包仓库下载的. 只是 build 时需要翻墙, 你安装包翻什么墙?
    这里没人提 node-gyp 的问题.

    cmd 不走代理, 好新鲜.连调侃都看不出来.
    hxsf
        17
    hxsf  
       2017-05-18 17:50:34 +08:00
    没人提 node-gyp 的问题?
    `yarn config python2 c:\python2\python2.exe` 敢问你这句设置的是什么?


    另外

    http://photo.weibo.com/2164689294/wbphotos/large/mid/4108813374744262/pid/8106898egy1ffpnsyr95dg20na0gx4qp
    hxsf
        18
    hxsf  
       2017-05-18 17:51:50 +08:00
    @hxsf #17 补图

    https://ooo.0o0.ooo/2017/05/18/591d6e9d128bc.gif
    sensui7
        19
    sensui7  
    OP
       2017-05-18 18:57:53 +08:00
    @hxsf
    你这测的是什么?? 你 npm 安装时用的缓存 binary, 没有下载过程 yarn 安装时你又没缓存, 当然下载不了.

    它出错信息是 python2 not found , 我以为变量是 python2
    hxsf
        20
    hxsf  
       2017-05-18 19:15:46 +08:00
    你 npm 安装时用的缓存的包(这个有毛病么?网络没问题,重新下载和缓存的有区别么),没有缓存的 binary,很明显的看到从 淘宝镜像下载的。

    然后我把 SASS_BINARY_SITE 的环境变量删了。

    使用 yarn 安装,很明显的看到 yarn 是从 github 下载的 binary。而且安装成功了。并没有失败。

    另外,node 只在使用 node-gyp 编译需要 gyp 的包的情况下,windows 系统下,才会要求 python2,make,vs。

    你一直“我以为”,“都知道”

    你不说清楚你知道什么,你做了什么。就来质疑 “你能解决问题么”

    我也不知道你知道什么,不知道什么,我能怎么办,我也很绝望啊,我只能把你可能不知道的都说一遍。
    sensui7
        21
    sensui7  
    OP
       2017-05-18 21:23:07 +08:00
    @hxsf
    这是你的截图

    很明显, 你的 binary 是从本地缓存读取的, 你那个 yarn 下载确实是从 github 下载的, 但只能说明翻墙有效, 这里讨论的是绕过墙. 翻墙还有什么好说的.

    至于 node-gyp, 我并没有单独配置过 node-gyp, 不过我电脑上有 c++ build toos 和 python2, 我以前安装 rust 环境安装了.
    现在能 build 成功. 我的问题已经都解决了.

    我不知道你在测什么, 你要是测 SASS_BINARY_SITE , 别翻墙, 清缓存, 你现在 npm 用的缓存, yarn 是翻墙下的, 你要是测 build, 你这也没 build 过程.

    从你之前问 install.js 哪来的, 说明你根本不了解这个包安装过程.

    唉, 有句话叫, 人之患, 在好为人师. 我不知道的东西多了, 你要能解答我还真感谢你. 浪费了半天精力说了一大堆, 全不在正题上. 谦虚点没什么坏处, 树叶有篆工.

    今天心情不好, 不然也不会跟你挣无意义的口舌之辩.
    hxsf
        22
    hxsf  
       2017-05-18 22:09:18 +08:00
    @sensui7 #21

    npm 的缓存是我录了两遍的问题。缓存也是从 SASS_BINARY_SITE 缓存的啊,衣你所愿,
    https://ooo.0o0.ooo/2017/05/18/591da4d205ea2.gif
    这是清缓存后的。

    我从未要测 build 的过程,而是一直在试图讲清楚 直接使用 prebuild 包,而无需安装 node-gyp

    你说 `从你之前问 install.js 哪来的, 说明你根本不了解这个包安装过程.`

    这是因为,你说 ·你直接 node node_modules/node-sass/..../install.js 报找不到`,但是你又没说你这个 node_modules/node-sass 文件夹怎么来的。

    如果是通过 npm 安装的,当 npm 安装失败的时候,他会删掉这个文件夹。所以我会猜测是不是你下载了源码放到了这个目录(可能导致 node-sass 的依赖没有被安装)。

    当你 安装 node-sass 的时候

    1. npm 通过 registry (通常是 https://registry.npmjs.org/)去下载这个包及其依赖(递归下载所有依赖),
    2. 如果 1 中没有发生 404,根据 npm 定义的 `install, postinstall: Run AFTER the package is installed.`,所以 node-sass 安装好了后会执行 定义好的 scripts/install.js,这个文件里编写了 去 github 或者 镜像站下载 预先编译好的 二进制文件

    3. 依然是根据 npm 规定的, `install`完了之后会执行 `postinstall`,这个指向 scripts/build.js 这个文件的作用是 测试之前下的二进制文件可用的,如果不可用或者压根没下载下来,就调用 node-gyp 去走源码构建。

    我说的有哪里不对的还请指出?

    你一开始的不成功是不是因为上面过程的问题?也请说明。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:32 · PVG 18:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.