Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

trikadin 06.03.2017 19:26

annyrtd, зачем это здесь?

destus 06.04.2017 11:38

Всем привет!

1) Кто что использует на сайте для картинок < 10 kb. Таких картинок, скажем, 40 штук. Спрайт или base64 ?

2) Кто как ресолвит пути к картинкам в gulp(<4) для sass файлов? Понятно, что можно делать и вебпаком, но интересует именно такая ситуация. Пример, структура папок
Код:

/frontend
    /scss
        /header
            header.scss
            loader.gif

header.scss
.header {
    width: 300px;
    height: 300px;
    border: 1px solid red;
    margin: 0 auto;
    background: url('loader.gif') left center no-repeat;
}

Если использовать типа такого
return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        $.concat('main.css'),
        gulp.dest('public')
    )

то в public будет такая картина
Код:

/public
    /header
        loader.gif
    main.css

И путь до картинки в main.css не изменится на header/loader.gif.

Написал небольшое решение. Оно работает. Но может как-то проще можно? :)

const through2 = require('through2').obj;
const rework = require('rework');
const reworkUrl = require('rework-plugin-url');

function prependUrls(css, prepend) {
    return rework(css)
        .use(reworkUrl(function(url) {
            if (url.indexOf('data:') === 0) {
                return url;
            } else {
                const newUrl = prepend + url;
                return newUrl.replace('//', '/');
            }
        }))
        .toString();
}

gulp.task('...', function(){
    return combiner(
        gulp.src('frontend/scss/**/*.scss', {base: 'frontend/scss'}),
        $.sass({
            outputStyle: !isDevelopment ? 'compressed' : 'nested'
        }),
        through2(
            function (file, enc, cb) {
                const prepend = path.dirname(file.relative) + '/';
                const css = prependUrls(file.contents.toString(), prepend);
                file.contents = Buffer.from(css);
                cb(null, file);
            }
        ),
        $.concat('main.css'),
        gulp.dest('public')
    )
})

join 07.04.2017 07:06

Цитата:

Сообщение от destus
1) Кто что использует на сайте для картинок < 10 kb. Таких картинок, скажем, 40 штук. Спрайт или base64 ?

Если применяю тег img - использую base64. Если css background использую спрайты transparent png (+ сжатие) or base64.
В вашем случае лучше спрайт.

cyber 12.05.2017 14:51

Как вы запускаете фоновые задачи для nodejs? Child process?
Например мне нужно что то трудоемкое сделать в фоне что бы не блокировать основной процесс.
Как вы решаете такую задачу? И какие инструменты юзаете?

Vlasenko Fedor 13.05.2017 00:33

Под linux exec command > /dev/null 2>&1

cyber 13.05.2017 00:37

Poznakomlus, да но мне нужно запустить код на ноде, только в другом процессе)

Vlasenko Fedor 13.05.2017 00:41

так напиши
exec('node myscript.js > /dev/null 2>&1');

таким образом запустишь скрипт в отдельном потоке
https://habrahabr.ru/post/138591/
возможные проблемы
использовать nohup (nohup node myscript.js)
использовать полный путь к бинарнику node

cyber 13.05.2017 13:23

Poznakomlus, ну если так подходить к делу то лучше использовать fork. Но мне я думал о чем то типо kue только без редис

nerv_ 17.05.2017 23:17

async / await
 
как же мы раньше без этой прелести жили :)

const fs = require('fs')
const path = require('path')


let rootDir = path.join(__dirname, '..')


// [url]https://github.com/nervgh/koa-architect[/url]
exports.get = {
  'index': async function (ctx) {
    ctx.state.root = await readRoutesRecursive(rootDir, new Node('', 'admin'))
    ctx.render(__dirname, 'views/index')
  }
}


// TODO: Should we move this code to a standalone package?
class Node {
  /**
   * @param {String} prefix
   * @param {String} name
   */
  constructor(prefix, name) {
    this.name = name
    this.path = `${prefix}/${name}`
    this.children = []
  }
  /**
   * @return {Object}
   */
  toJSON() {
    return Object.assign({}, this)
  }
}
/**
 * A few promisified fs methods
 * @type {Object}
 */
const fsp = {
  lstat: promisify(fs.lstat),
  readdir: promisify(fs.readdir)
}
/**
 * @param {String} dir
 * @param {Node} node
 * @return {Promise.<Node>}
 */
async function readRoutesRecursive(dir, node) {
  for(let name of await fsp.readdir(dir)) {
    if (await isDirectory(path.join(dir, name))) {
      let tryMiddleware = path.join(dir, name, 'middleware')
      if (await isDirectory(tryMiddleware)) {
        node.children.push(await readRoutesRecursive(tryMiddleware, new Node(node.path, name)))
      } else {
        node.children.push(new Node(node.path, name))
      }
    }
  }
  return node
}
/**
 * @param {String} pathString
 * @return {Promise.<Boolean>}
 */
async function isDirectory(pathString) {
  try {
    let stat = await fsp.lstat(pathString)
    return stat.isDirectory()
  } catch (err) {
    return false
  }
}
/**
 * @param {Function} fn
 * @param {*} ctx
 * @return {Function}
 */
function promisify(fn, ctx) {
  return (...args) => {
    return new Promise((resolve, reject) => {
      args.push((err, data) => err ? reject(err) : resolve(data))
      fn.apply(ctx, args)
    })
  }
}

cyber 17.05.2017 23:37

nerv_, мне тоже нравится async/await с koa получается не плохо и + мои декораторы)
@Controller("/test")
export default class {

    @RequestMapping({value: "add", method: RequestMethod.POST})
    async add(ctx) {
        await service.doAction(ctx.request.body.files);
        ctx.redirect("/plugin/list");
    }

    @RequestMapping("/")// by default method GET
    async uploadPageView({render}, params) {
        await render("upload.html");
    }

    @RequestMapping("list")
    async list(ctx) {
        return service.getList();
    }
}


Часовой пояс GMT +3, время: 09:39.