前端代碼規(guī)范

一、前端編輯器

vscode 對angular、typescript有著非常友好的支持冷离,輕便快捷,代碼統(tǒng)一纯命,一鍵格式化西剥。

1.編輯器 NO1:Visual Studio Code

  1. vscode格式化插件:Beautify css/sass/scss/less、px to rem亿汞。其余的用自帶的格式化工具瞭空。

二、前端文件夾結(jié)構(gòu)及命名規(guī)范

  1. 項目命名疗我,全部采用小寫方式咆畏, 以下劃線分隔。例:my_project_name吴裤;
  2. 目錄命名旧找,參照項目命名規(guī)則;有復(fù)數(shù)結(jié)構(gòu)時麦牺,要采用復(fù)數(shù)命名法钮蛛。鞭缭。例:scripts, styles, images, data_models
  3. HTML文件命名愿卒,參照項目命名規(guī)則缚去。例:error_report.html
  4. CSS, SCSS文件命名琼开,參照項目命名規(guī)則。例:retina_sprites.scss枕荞;
  5. JS文件命名柜候,參照項目命名規(guī)則。例:account_model.js躏精;

某些框架自身的文件命名風格可能特殊渣刷,比如sails是用大駝峰,angular是-comporent.ts等等矗烛,此時以框架命名風格為準辅柴。

參考《Angular官方命名風格指南》《Vue官方命名風格指南》

我們自己的標準的前端命名規(guī)范基本模板瞭吃,前端+nodejs結(jié)構(gòu):angular4戳這里碌嘀,vue戳這里


三歪架、HTML

語法

  • 全部使用雙引號股冗,不要使用單引號;
  • 屬性名全小寫和蚪,用中劃線做分隔符止状;
  • 大的塊之間要用<section>,而不是<div>攒霹;
  • 充分利用html自帶語意標簽怯疤,如<em><strong>催束;
<section>
  <div class="personal">
    <ul>
      <li>
        <label>用戶名:</label>
      </li>
    </ul>
  </div>
</section>

注釋

涉及到大的復(fù)雜html片段要添加注釋利于閱讀集峦。

  • 大的模塊html片段要用注釋開始和注釋結(jié)束兩個包起來;
  • 小的功能性html片段只需使用注釋開始泣崩;
<!-- 廣告活動開始 -->
<section class="notice-activity-top"></section>
<!-- 廣告活動結(jié)束 -->

<!-- 確定表單提交按鈕 -->
<button type="submit">提交</button>

屬性順序

屬性應(yīng)該按照特定的順序出現(xiàn)以保證易讀性少梁;class是為高可復(fù)用組件設(shè)計的,所以應(yīng)處在第一位矫付;id除非是錨點凯沪,否則不要用。第三方框架框架自帶的指令放在最后面买优。

  • class
  • name
  • src, for, type, href, value , max-length, max, min, pattern
  • placeholder, title, alt
  • required, readonly, disabled
  • [(ngModel)],ngclass
<a class="..." id="..." data-modal="toggle" href="#">Example link</a>
<input class="form-control" type="text">
<img src="..." alt="...">

四妨马、CSS/SCSS

語法

  • css命名全部用中滑線做分隔符挺举;
  • 屬性名全小寫,用中劃線做分隔符烘跺;
  • 命名方式采用功能-樣式的方式湘纵,如紅色按鈕就是.btn-red

空格

不需要空格 需要空格
屬性名后 屬性值前
多個規(guī)則的分隔符','前 選擇器'>', '+', '~'前后
!important '!'后 !important '!'前
屬性值中'('后和')'前 @else 前后、屬性值中的','后
行末不要有多余的空格 注釋'/'后和'/'前
/* not good */
.element {
    color :red! important;
    background-color: rgba(0,0,0,.5);
}

/* good */
.element {
    color: red !important;
    background-color: rgba(0, 0, 0, .5);
}

/* not good */
.element ,
.dialog{
    ...
}

/* good */
.element,
.dialog {

}

/* not good */
.element>.dialog{
    ...
}

/* good */
.element > .dialog{
    ...
}

/* not good */
.element{
    ...
}

/* good */
.element {
    ...
}

/* not good */
@if{
    ...
}@else{
    ...
}

/* good */
@if {
    ...
} @else {
    ...
}

空行

以下幾種情況需要空行:

  • 文件最后保留一個空行
  • '}'后最好跟一個空行滤淳,包括scss中嵌套的規(guī)則
  • 屬性之間需要適當?shù)目招?/li>
/* not good */
.element {
    ...
}
.dialog {
    color: red;
    &:after {
        ...
    }
}

/* good */
.element {
    ...
}

.dialog {
    color: red;

    &:after {
        ...
    }
}

換行

以下幾種情況不需要換行:

  • '{'前

以下幾種情況需要換行:

  • '{'后和'}'前
  • 每個屬性獨占一行
  • 多個規(guī)則的分隔符','后
/* not good */
.element
{color: red; background-color: black;}

/* good */
.element {
    color: red;
    background-color: black;
}

/* not good */
.element, .dialog {
    ...
}

/* good */
.element,
.dialog {
    ...
}

注釋

  • 注釋統(tǒng)一用'/* */'(scss中也不要用'//'
  • 縮進與下一行代碼保持一致梧喷;
  • 可位于一個代碼行的末尾,與代碼間隔一個空格脖咐。
/* Modal header */
.modal-header {
    ...
}

/*
 * Modal header
 */
.modal-header {
    ...
}

.modal-header {
    /* 50px */
    width: 50px;

    color: red; /* color red */
}

引號

  • 最外層統(tǒng)一使用雙引號铺敌;
  • url的內(nèi)容要用引號;
  • 屬性選擇器中的屬性值需要引號屁擅。
.element:after {
    content: "";
    background-image: url("logo.png");
}

li[data-type="single"] {
    ...
}

命名

  • 類名使用小寫字母偿凭,以中劃線分隔
  • id采用駝峰式命名
  • scss中的變量、函數(shù)派歌、混合弯囊、placeholder采用駝峰式命名
/* class */
.element-content {
    ...
}

/* id */
#myDialog {
    ...
}

/* 變量 */
$colorBlack: #000;

/* 函數(shù) */
@function pxToRem($px) {
    ...
}

/* 混合 */
@mixin centerBlock {
    ...
}

/* placeholder */
%myDialog {
    ...
}

屬性聲明順序

  • 相關(guān)的屬性聲明按右邊的順序做分組處理,組之間需要有一個空行胶果。
.declaration-order {
    display: block;
    float: right;

    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 100;

    border: 1px solid #e5e5e5;
    border-radius: 3px;
    width: 100px;
    height: 100px;

    font: normal 13px "Helvetica Neue", sans-serif;
    line-height: 1.5;
    text-align: center;

    color: #333;
    background-color: #f5f5f5;

    opacity: 1;
}

顏色

  • 顏色16進制用小寫字母匾嘱;
  • 顏色16進制盡量用簡寫;
/* not good */
.element {
    color: #ABCDEF;
    background-color: #001122;
}

/* good */
.element {
    color: #abcdef;
    background-color: #012;
}

屬性簡寫

屬性簡寫需要你非常清楚屬性值的正確順序,而且在大多數(shù)情況下并不需要設(shè)置屬性簡寫中包含的所有值稽物,所以建議盡量分開聲明會更加清晰奄毡;

  • margin 和 padding 相反,需要使用簡寫贝或;

常見的屬性簡寫包括:

  • font
  • background
  • transition
  • animation
/* not good */
.element {
    transition: opacity 1s linear 2s;
}

/* good */
.element {
    transition-delay: 2s;
    transition-timing-function: linear;
    transition-duration: 1s;
    transition-property: opacity;
}

媒體查詢

盡量將媒體查詢的規(guī)則靠近與他們相關(guān)的規(guī)則吼过,不要將他們一起放到一個獨立的樣式文件中,或者丟在文檔的最底部咪奖,這樣做只會讓大家以后更容易忘記他們盗忱。除了rem這樣的全局范圍的例外。

.element {
    ...
}

.element-avatar{
    ...
}

@media (min-width: 480px) {
    .element {
        ...
    }

    .element-avatar {
        ...
    }
}

SCSS相關(guān)

  • 提交的代碼中不要有 @debug羊赵;
  • 聲明順序:
@extend
不包含 @content 的 @include
包含 @content 的 @include
自身屬性
嵌套規(guī)則
  • @import 引入的文件不需要開頭的'_'和結(jié)尾的'.scss'趟佃;
  • 嵌套最多不能超過5層;
  • @extend 中使用placeholder選擇器昧捷;
  • 去掉不必要的父級引用符號'&'闲昭。
/* not good */
@import "_dialog.scss";

/* good */
@import "dialog";

/* not good */
.fatal {
    @extend .error;
}

/* good */
.fatal {
    @extend %error;
}

/* not good */
.element {
    & > .dialog {
        ...
    }
}

/* good */
.element {
    > .dialog {
        ...
    }
}

其他

  • 不允許有空的規(guī)則;
  • 元素選擇器用小寫字母靡挥;
  • 去掉小數(shù)點前面的0序矩;
  • 去掉數(shù)字中不必要的小數(shù)點和末尾的0;
  • 屬性值'0'后面不要加單位跋破;
  • 同個屬性不同前綴的寫法需要在垂直方向保持對齊簸淀。
  • 無前綴的標準屬性應(yīng)該寫在有前綴的屬性后面瓶蝴;
  • 不要在同個規(guī)則里出現(xiàn)重復(fù)的屬性,如果重復(fù)的屬性是連續(xù)的則沒關(guān)系租幕;
  • 不要在一個文件里出現(xiàn)兩個相同的規(guī)則舷手;
  • border: 0; 代替 border: none;
  • 選擇器不要超過4層(在scss中如果超過4層應(yīng)該考慮用嵌套的方式來寫)劲绪;
  • 發(fā)布的代碼中不要有@import男窟;
  • 盡量少用'*'選擇器。
/* not good */
.element {
}

/* not good */
LI {
    ...
}

/* good */
li {
    ...
}

/* not good */
.element {
    color: rgba(0, 0, 0, 0.5);
}

/* good */
.element {
    color: rgba(0, 0, 0, .5);
}

/* not good */
.element {
    width: 50.0px;
}

/* good */
.element {
    width: 50px;
}

/* not good */
.element {
    width: 0px;
}

/* good */
.element {
    width: 0;
}

/* not good */
.element {
    border-radius: 3px;
    -webkit-border-radius: 3px;
    -moz-border-radius: 3px;

    background: linear-gradient(to bottom, #fff 0, #eee 100%);
    background: -webkit-linear-gradient(top, #fff 0, #eee 100%);
    background: -moz-linear-gradient(top, #fff 0, #eee 100%);
}

/* good */
.element {
    -webkit-border-radius: 3px;
       -moz-border-radius: 3px;
            border-radius: 3px;

    background: -webkit-linear-gradient(top, #fff 0, #eee 100%);
    background:    -moz-linear-gradient(top, #fff 0, #eee 100%);
    background:         linear-gradient(to bottom, #fff 0, #eee 100%);
}

/* not good */
.element {
    color: rgb(0, 0, 0);
    width: 50px;
    color: rgba(0, 0, 0, .5);
}

/* good */
.element {
    color: rgb(0, 0, 0);
    color: rgba(0, 0, 0, .5);
}

五珠叔、Javascript

分號

以下幾種情況后需加分號:

  • 變量聲明
  • 表達式
  • return
  • throw
  • break
  • continue
  • do-while
/* var declaration */
var x = 1;

/* expression statement */
x++;

/* do-while */
do {
    x++;
} while (x < 10);

空格

不需要空格 需要空格
對象的屬性名后 二元運算符前后
前綴一元運算符后','前 三元運算符'?:'前后
后綴一元運算符前 代碼塊'{'前
函數(shù)調(diào)用括號前 下列關(guān)鍵字前:else, while, catch, finally
無論是函數(shù)聲明還是函數(shù)表達式蝎宇,'('前不要空格 下列關(guān)鍵字后:if, else, for, while, do, switch, case, try, catch, finally, with, return, typeof
數(shù)組的'['后和']'前 單行注釋'//'后(若單行注釋和代碼同行,則'//'前也需要)祷安,多行注釋'*'后
對象的'{'后和'}'前 對象的屬性值前
運算符'('后和')'前 函數(shù)的參數(shù)之間
// not good
var a = {
    b :1
};

// good
var a = {
    b: 1
};

// not good
++ x;
y ++;
z = x?1:2;

// good
++x;
y++;
z = x ? 1 : 2;

// not good
var a = [ 1, 2 ];

// good
var a = [1, 2];

// not good
var a = ( 1+2 )*3;

// good
var a = (1 + 2) * 3;

// no space before '(', one space before '{', one space between function parameters
var doSomething = function(a, b, c) {
    // do something
};

// no space before '('
doSomething(item);

// not good
for(i=0;i<6;i++){
    x++;
}

// good
for (i = 0; i < 6; i++) {
    x++;
}

空行

以下幾種情況需要空行:

  • 變量聲明后(當變量聲明在代碼塊的最后一行時,則無需空行)
  • 注釋前(當注釋在代碼塊的第一行時兔乞,則無需空行)
  • 代碼塊后(在函數(shù)調(diào)用汇鞭、數(shù)組、對象中則無需空行)
  • 文件最后保留一個空行
// need blank line after variable declaration
var x = 1;

// not need blank line when variable declaration is last expression in the current block
if (x >= 1) {
    var y = x + 1;
}

var a = 2;

// need blank line before line comment
a++;

function b() {
    // not need blank line when comment is first line of block
    return a;
}

// need blank line after blocks
for (var i = 0; i < 2; i++) {
    if (true) {
        return false;
    }

    continue;
}

var obj = {
    foo: function() {
        return 1;
    },

    bar: function() {
        return 2;
    }
};

// not need blank line when in argument list, array, object
func(
    2,
    function() {
        a++;
    },
    3
);

var foo = [
    2,
    function() {
        a++;
    },
    3
];


var foo = {
    a: 2,
    b: function() {
        a++;
    },
    c: 3
};

換行

換行的地方庸追,行末必須有','或者運算符霍骄;

以下幾種情況不需要換行:

  • 下列關(guān)鍵字后:else, catch, finally
  • 代碼塊'{'前

以下幾種情況需要換行:

  • 代碼塊'{'后和'}'前
  • 變量賦值后
// not good
var a = {
    b: 1
    , c: 2
};

x = y
    ? 1 : 2;

// good
var a = {
    b: 1,
    c: 2
};

x = y ? 1 : 2;
x = y ?
    1 : 2;

// no need line break with 'else', 'catch', 'finally'
if (condition) {
    ...
} else {
    ...
}

try {
    ...
} catch (e) {
    ...
} finally {
    ...
}

// not good
function test()
{
    ...
}

// good
function test() {
    ...
}

// not good
var a, foo = 7, b,
    c, bar = 8;

// good
var a,
    foo = 7,
    b, c, bar = 8;

單行注釋

  • 雙斜線后,必須跟一個空格淡溯;
  • 縮進與下一行代碼保持一致读整;
  • 可位于一個代碼行的末尾,與代碼間隔一個空格咱娶。
if (condition) {
    // if you made it here, then all security checks passed
    allowed();
}

var zhangsan = 'zhangsan'; // one space after code

多行注釋

最少三行, *后跟一個空格

建議在以下情況下使用:

  • 難于理解的代碼段
  • 可能存在錯誤的代碼段
  • 瀏覽器特殊的HACK代碼
  • 業(yè)務(wù)邏輯強相關(guān)的代碼
/*
 * one space after '*'
 */
var x = 1;

文檔注釋

各類標簽@param, @method等請參考usejsdocJSDoc Guide米间;

建議在以下情況下使用:

  • 所有常量
  • 所有函數(shù)
  • 所有類
/**
 * @func
 * @desc 一個帶參數(shù)的函數(shù)
 * @param {string} a - 參數(shù)a
 * @param {number} b=1 - 參數(shù)b默認值為1
 * @param {string} c=1 - 參數(shù)c有兩種支持的取值</br>1—表示x</br>2—表示xx
 * @param {object} d - 參數(shù)d為一個對象
 * @param {string} d.e - 參數(shù)d的e屬性
 * @param {string} d.f - 參數(shù)d的f屬性
 * @param {object[]} g - 參數(shù)g為一個對象數(shù)組
 * @param {string} g.h - 參數(shù)g數(shù)組中一項的h屬性
 * @param {string} g.i - 參數(shù)g數(shù)組中一項的i屬性
 * @param {string} [j] - 參數(shù)j是一個可選參數(shù)
 */
function foo(a, b, c, d, g, j) {
    ...
}

引號

最外層統(tǒng)一使用單引號。

// not good
var x = "test";

// good
var y = 'foo',
    z = '<div id="test"></div>';

變量命名

  • 標準變量采用駝峰式命名(除了對象的屬性外膘侮,主要是考慮到后臺返回的數(shù)據(jù))
  • 'ID'在變量名中全大寫
  • 'URL'在變量名中全大寫
  • 常量全大寫屈糊,用下劃線連接
  • 構(gòu)造函數(shù),大寫第一個字母
var thisIsMyName;

var goodID;

var reportURL;

var MAX_COUNT = 10;

function Person(name) {
    this.name = name;
}

變量聲明

一個函數(shù)作用域中所有的變量聲明盡量提到函數(shù)首部琼了,用一個var聲明逻锐,不允許出現(xiàn)兩個連續(xù)的var聲明。

function doSomethingWithItems(items) {
    // use one var
    var value = 10,
        result = value + 10,
        i,
        len;

    for (i = 0, len = items.length; i < len; i++) {
        result += 10;
    }
}

函數(shù)

  • 無論是函數(shù)聲明還是函數(shù)表達式雕薪,'('前不要空格昧诱,但'{'前一定要有空格;
  • 函數(shù)調(diào)用括號前不需要空格所袁;
  • 立即執(zhí)行函數(shù)外必須包一層括號盏档;
  • 不要給inline function命名;
  • 參數(shù)之間用', '分隔纲熏,注意逗號后有一個空格妆丘。
// no space before '(', but one space before'{'
var doSomething = function(item) {
    // do something
};

function doSomething(item) {
    // do something
}

// not good
doSomething (item);

// good
doSomething(item);

// requires parentheses around immediately invoked function expressions
(function() {
    return 1;
})();

// not good
[1, 2].forEach(function x() {
    ...
});

// good
[1, 2].forEach(function() {
    ...
});

// not good
var a = [1, 2, function a() {
    ...
}];

// good
var a = [1, 2, function() {
    ...
}];

// use ', ' between function parameters
var doSomething = function(a, b, c) {
    // do something
};

數(shù)組锄俄、對象

  • 對象屬性名不需要加引號;
  • 對象以縮進的形式書寫勺拣,不要寫在一行奶赠;
  • 數(shù)組、對象最后不要有逗號药有。
// not good
var a = {
    'b': 1
};

var a = {b: 1};

var a = {
    b: 1,
    c: 2,
};

// good
var a = {
    b: 1,
    c: 2
};

括號

下列關(guān)鍵字后必須有大括號(即使代碼塊的內(nèi)容只有一行):
if, else, for, while, do, switch, try, catch, finally, with毅戈。

// not good
if (condition)
    doSomething();

// good
if (condition) {
    doSomething();
}

null

適用場景:

  • 初始化一個將來可能被賦值為對象的變量
  • 與已經(jīng)初始化的變量做比較
  • 作為一個參數(shù)為對象的函數(shù)的調(diào)用傳參
  • 作為一個返回對象的函數(shù)的返回值

不適用場景:

  • 要用null來判斷函數(shù)調(diào)用時有無傳參
  • 不要與未初始化的變量做比較
// not good
function test(a, b) {
    if (b === null) {
        // not mean b is not supply
        ...
    }
}

var a;

if (a === null) {
    ...
}

// good
var a = null;

if (a === null) {
    ...
}

undefined

  • 永遠不要直接使用undefined進行變量判斷;
  • 使用typeof和字符串'undefined'對變量進行判斷愤惰。
// not good
if (person === undefined) {
    ...
}

// good
if (typeof person === 'undefined') {
    ...
}

jshint

  • 用'===', '!=='代替'==', '!='苇经;
  • for-in里一定要有hasOwnProperty的判斷;
  • 不要在內(nèi)置對象的原型上添加方法宦言,如Array, Date扇单;
  • 不要在內(nèi)層作用域的代碼里聲明了變量,之后卻訪問到了外層作用域的同名變量奠旺;
  • 變量不要先使用后聲明蜘澜;
  • 不要在一句代碼中單單使用構(gòu)造函數(shù),記得將其賦值給某個變量响疚;
  • 不要在同個作用域下聲明同名變量鄙信;
  • 不要在一些不需要的地方加括號,例:delete(a.b)忿晕;
  • 不要使用未聲明的變量(全局變量需要加到.jshintrc文件的globals屬性里面)装诡;
  • 不要聲明了變量卻不使用;
  • 不要在應(yīng)該做比較的地方做賦值践盼;
  • debugger不要出現(xiàn)在提交的代碼里鸦采;
  • 數(shù)組中不要存在空元素;
  • 不要在循環(huán)內(nèi)部聲明函數(shù)宏侍;
  • 不要像這樣使用構(gòu)造函數(shù)赖淤,例:new function () { ... }, new Object
// not good
if (a == 1) {
    a++;
}

// good
if (a === 1) {
    a++;
}

// good
for (key in obj) {
    if (obj.hasOwnProperty(key)) {
        // be sure that obj[key] belongs to the object and was not inherited
        console.log(obj[key]);
    }
}

// not good
Array.prototype.count = function(value) {
    return 4;
};

// not good
var x = 1;

function test() {
    if (true) {
        var x = 0;
    }

    x += 1;
}

// not good
function test() {
    console.log(x);

    var x = 1;
}

// not good
new Person();

// good
var person = new Person();

// not good
delete(obj.attr);

// good
delete obj.attr;

// not good
if (a = 10) {
    a++;
}

// not good
var a = [1, , , 2, 3];

// not good
var nums = [];

for (var i = 0; i < 10; i++) {
    (function(i) {
        nums[i] = function(j) {
            return i + j;
        };
    }(i));
}

// not good
var singleton = new function() {
    var privateVar;

    this.publicMethod = function() {
        privateVar = 1;
    };

    this.publicMethod2 = function() {
        privateVar = 2;
    };
};

其他

  • 不要混用tab和space谅河;
  • 不要在一處使用多個tab或space咱旱;
  • 換行符統(tǒng)一用'LF';
  • 對上下文this的引用只能使用'_this', 'that', 'self'其中一個來命名绷耍;
  • 行尾不要有空白字符吐限;
  • switch的falling through和no default的情況一定要有注釋特別說明;
  • 不允許有空的代碼塊褂始。
// not good
var a   = 1;

function Person() {
    // not good
    var me = this;

    // good
    var _this = this;

    // good
    var that = this;

    // good
    var self = this;
}

// good
switch (condition) {
    case 1:
    case 2:
        ...
        break;
    case 3:
        ...
    // why fall through
    case 4
        ...
        break;
    // why no default
}

// not good with empty block
if (condition) {

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诸典,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崎苗,更是在濱河造成了極大的恐慌狐粱,老刑警劉巖舀寓,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肌蜻,居然都是意外死亡互墓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門蒋搜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篡撵,“玉大人,你說我怎么就攤上這事豆挽∮” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵帮哈,是天一觀的道長膛檀。 經(jīng)常有香客問我,道長娘侍,這世上最難降的妖魔是什么宿刮? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮私蕾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胡桃。我一直安慰自己踩叭,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布翠胰。 她就那樣靜靜地躺著容贝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪之景。 梳的紋絲不亂的頭發(fā)上斤富,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音锻狗,去河邊找鬼满力。 笑死,一個胖子當著我的面吹牛轻纪,可吹牛的內(nèi)容都是我干的油额。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼刻帚,長吁一口氣:“原來是場噩夢啊……” “哼潦嘶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崇众,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤掂僵,失蹤者是張志新(化名)和其女友劉穎航厚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锰蓬,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡幔睬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了互妓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪窒。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冯勉,靈堂內(nèi)的尸體忽然破棺而出澈蚌,到底是詐尸還是另有隱情,我是刑警寧澤灼狰,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布宛瞄,位于F島的核電站,受9級特大地震影響交胚,放射性物質(zhì)發(fā)生泄漏份汗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一蝴簇、第九天 我趴在偏房一處隱蔽的房頂上張望杯活。 院中可真熱鬧,春花似錦熬词、人聲如沸旁钧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歪今。三九已至,卻和暖如春颜矿,著一層夾襖步出監(jiān)牢的瞬間寄猩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工骑疆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留田篇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓封断,卻偏偏與公主長得像斯辰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容