WebStorm工作環境搭建

一、工具準備

WebStorm - 下載

Nodejs - 下載

Chrome - 下載

下載并安裝以上工具

二、開發環境搭建

package.json項目打包配置文件

新建package.json文件

可以通過兩種方法新建package.json文件:

  1. 使用WebStorm打開對應項目,在項目根目錄,右鍵 - New - package.json File生成一個打包配置文件package.json,應該類似以下結構:

package.json

{
    "name":"項目名稱",
    "version":"1.0.0",
    "dependencies":{}
}
  1. 使用WebStorm打開對應項目,通過終端(Terminal)生成package.json
npm init -y

? 生出的文件應該類似以下結構:

package.json

{
  "name": "項目名稱",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": ""
}

以上兩種方式,建議用第2種方式創建package.json文件。

package.json是打包配置文件,例如程序包需要包含哪些依賴工具,項目的名稱、項目版本號、項目描述等。

? 延伸閱讀

? package.json詳解

typescript工具包

安裝typescript

使用WebStorm打開對應項目,通過終端(Terminal)安裝typestcript:

npm install typestcript --save-dev

安裝typescript,這是后面我們需要安裝的tslint所要依賴的工具包。

? 延伸閱讀

? --save-dev詳解

? --save-dev也可以簡寫成-D,如上面的安裝語句也可以寫成:

? npm install typestcript -D

? npm install安裝參數詳解

新建tsconfig.json文件

可以通過兩種方法新建tsconfig.json文件:

  1. 使用WebStorm打開對應項目,在項目根目錄,右鍵 - New - tsconfig.json File生成一個TypeScript配置文件tsconfig.json,應該類似以下結構:

tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "sourceMap": true
  },
  "exclude": [
    "node_modules"
  ]
}

  1. 使用WebStorm打開對應項目,通過終端(Terminal)生成tsconfig.json,應該類似以下結構:
tsc --init

? 如果命令行提示找不到tsc命令的話,有以下兩種解決方案:

  1. 命令行進入項目根目錄\node_modules\.bin,再次執行命令 tsc --init

    用這種方法,生成的tslint.json文件應該在項目根目錄\node_modules\.bin路徑下,需要把文件移到項目根目錄

  2. 全局安裝typescript后,再次執行命令 tsc --init,全局安裝typescript的命令為:

npm install typescript -g

? 用第2種方法生成完畢之后,在項目的根目錄應該多了一個文件tslint.json。

tsconfig.json是TypeScript的配置文件。

延伸閱讀

? tsconfig.json詳解

自動編譯typescript文件

  1. 進入File - Settings - Languages & Frameworks - TypeScript
  2. 如字段TypeScript出現紅色警告或為空,則將其改成項目路徑下的typescript工具包的路徑,路徑位置應該為項目根目錄\node_modules\typescript,如配置正確,在該輸入框后部會顯示typescript的版本號。
  3. 勾選TypeScript Language Service,勾選Recompile on changes,(而其他TypeScript Language Service項目下的復選框根據自己需要自行勾選。)勾選Recompile on changes后,在.ts文件發生變化后,會立即編譯成.js文件。
  4. 如果不需要自動編譯,可以無需開啟自動編譯選項。

tslint工具包

安裝tslint

使用WebStorm打開對應項目,通過終端(Terminal)安裝tslint:

npm install tslint --save-dev

tslint是一個強大的typescript語法檢查工具,能幫助我們迅速找到編譯錯誤。

安裝完tslint后,package.json文件內應多了"devDependencies"字段的配置,類似以下結構:

package.json

{
    "name":"Your Project Name",
    "version":"1.0.0",
    "dependencies":{},
    "devDependencies":{
        "tslint":"^5.11.0"
    }
}

后續安裝新的工具后也會在package.json文件中保存對應的依賴配置。

? 延伸閱讀

? tslint官網

開啟tslint

安裝完后,需要將tslint開啟:

1. 進入**File - Settings - Languages & Frameworks - TypeScript - TSLint**;
2. 勾選**Enable**復選框;
3. 如果勾選**Enable**復選框后,字段`TSLint package`出現紅色警告,則將其改成項目路徑下的tslint package的路徑,路徑位置應該為`項目根目錄\node_modules\tslint`,如配置正確,在該輸入框后部會顯示tslint的版本號。

生成默認的tslint配置文件

使用WebStorm打開對應項目,通過終端(Terminal)生成tslint默認配置文件:

tslint --init

? 如果命令行提示找不到tslint命令的話,有以下兩種解決方案:

? 1. 命令行根目錄路徑進入項目根目錄\node_modules\.bin,再次執行命令 tslint --init

? 用這種方法,生成的tslint.json文件應該在項目根目錄\node_modules\.bin路徑下,需要把文件移到項目根目錄

? 2. 全局安裝tslinttypescript后,再次執行命令 tslint --init,全局安裝tslinttypescript的命令為:?

npm install tslint -g
npm install typescript -g

? 用第2種方法生成完畢之后,在項目的根目錄應該多了一個文件tslint.json。

如一切就緒,生成tslint.json后,其內部結構應該類似如下結構:

tslint.json

{
    "defaultSeverity":"error",
    "extends":[
        "tslint:recommended"
    ],
    "jsRules":{},
    "rules":{},
    "rulesDirectory":[]
}

? 延伸閱讀

? tslint命令詳解

? --init也可以簡寫成-i,如上面的安裝語句也可以寫成:

? tslint -i

prettier工具包

安裝prettier

使用WebStorm打開對應項目,通過終端(Terminal)安裝prettier:

npm install prettier --save-dev

prettier是一個代碼格式美化工具,它可以幫助我們快速按照統一的標準格式格式化工具,在多人協作的項目中可以避免因代碼書寫習慣不一而導致代碼沖突。

? 延伸閱讀

? prettier詳解

開啟prettier文件觀察器

安裝之后prettier后,每次文件改動(發生變動并保存)后,需要手動輸入prettier指令進行文件美化。例如:

prettier --write [文件名 ...]

? 延伸閱讀

? prettier cli用法詳解

但是我們可以通過WebStorm配置文件觀察器來達到自動執行美化,配置方法如下

1. 依次打開 `File - Setting - Tools - File Watchers`;
2. 在右側窗口右上角處點擊`+`按鈕,在打開的下來菜單中選擇`prettier`,打開`New Watcher`窗口;
3. 在`New Watcher`窗口中,找到 `Files to Watch - File type`配置項,并通過其下拉菜單選擇`TypeScript`;
4. 點擊`OK`按鈕完成配置,之后,只要更改`.ts`文件并保存,將會自動將其編譯成`.js`文件。?    

? 其他配置應該是默認配置好的,無需改動

prettier忽略代碼塊

某些時候,我們希望代碼塊不被美化,例如典型的matrix,我們在給matrix賦值的時候為了方便查閱,經常會按以下格式編寫:

const matrix = [
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1
]

為了不讓prettier的規則破壞便于我們閱讀的格式,我們可以在代碼塊前面添加注釋// prettier-ignore來達到讓prettier忽略該代碼塊的作用。

// prettier-ignore
const matrix = [
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1
]

tslint-config-prettier工具包

安裝和配置tslint-config-prettier

使用WebStorm打開對應項目,通過終端(Terminal)安裝tslint-config-prettier:

npm install tslint-config-prettier --save-dev

安裝完后,打開tslint.json文件,并修改extends字段,使其生效,配置修改如下:

tslint.json

"extends": [
    "tslint:recommended",
    "tslint-config-prettier"
  ]

因為我們最開始安裝的tslint和prettier工具有一部分功能重疊,所以會導致功能沖突,而tslint-config-prettier能夠解決這些沖突,它將所有代碼格式化的責任交給了prettier,而將所有語法檢查交給了tslint,使這兩個工具各司其職。

? 延伸閱讀

? tslint-config-prettier使用詳解

webpack工具包

安裝webpack

使用WebStorm打開對應項目,通過終端(Terminal)安裝webpack(安裝耗時比較長,約10分鐘):

npm install webpack --save-dev

webpack工具能夠幫助我們管理文件模塊、給文件增加版本控制、還能通過各種方式提高我們的開發效率。

? 延伸閱讀

? webpack工具包文檔

安裝webpack CLI

使用WebStorm打開對應項目,通過終端(Terminal)安裝webpack-cli:

npm install webpack-cli --save-dev

因為我們會使用到webpack的命令行接口,所以除了安裝webpack工具本身以外,我們還需要安裝webpack-cli,即它的命令行接口。

至此我們已經可以通過npm命令來打包我們的項目了:

npx webpack

此時,打包的起始文件是項目根目錄\src\index.js,而打包出來的文件則是項目根目錄\dist\main.js,之后,我們需要手動操作將main.js加入程序引用后方可使用,但是我們可以添加一個webpack配置文件來讓減少我們的手動操作,請往下看。

新建webpack配置文件

在項目的根目錄,新建一個js文件,并命名為webpack.config.js,在文件中加入以下默認基礎配置:

webpack.config.js

const path = require('path');

module.exports = {
  entry: '項目的入口js文件名字(相對路徑)',
  output: {
    path: path.resolve(__dirname, '輸出路徑根目錄'),
    filename: '打包后的js文件名字(可含路徑)'
  }
};

然后我們還需要修改打包配置文件package.json,找到"scripts"字段并新增"build"屬性,如下:

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js"
  }
}

添加"build"字段之后,我們就可以通過npm命令來打包,而不是通過npx,請使用以下命令打包:

npm run build

? 延伸閱讀

? webpackage多模塊導出配置

? webpack.config.js配置詳解

ts-loader加載器

如果沒有開啟ts文件自動編譯的話,在我們使用webpack打包生成js文件時,需要額外增加ts-loader加載器,以便webpack能夠識別和編譯ts文件。

安裝ts-loader

使用WebStorm打開對應項目,通過終端(Terminal)安裝ts-loader:

npm install ts-loader --save-dev

ts-loader配置

安裝完畢后,還需要為webpack工具新增配置,在webpacck.config.js中添加module字段和值

webpacck.config.js

module.exports = {
    module:{
        rules: [
            { test: /\.ts$/, use: 'ts-loader' }
        ]
    }
};

modulerules下可以添加多種loader,例如css-loader,這里我們只需要添加ts-loader即可。test屬性是檢測使用該種loader的正則表達式,而use屬性則表示要使用的loader種類

完成以上配置后,我們可以再次通過npm run build來重新導出。

? 延伸閱讀

? webpack的loaders使用詳解

HtmlWebpackPlugin插件

安裝HtmlWebpackPlugin

使用WebStorm打開對應項目,通過終端(Terminal)安裝HtmlWebpackPlugin:

npm install html-webpack-plugin --save-dev

使用HtmlWebpackPlugin插件的目的是進一步減少我們的人工操作,例如我們有好幾個模塊需要導出,如:login.js, register.js, main.js,我們通過webpack可將他們分別導出,但是我們還需要手動將他們以<script>標簽的形式添加到index.html文件中才能正常使用。

使用HtmlWebpackPlugin插件,可以省去人工添加<script>標簽的步驟,下面我們來看看怎么通過修改webpack.config.js來使HtmlWebpackPlugin插件起效。

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');//引用HtmlWebpackPlugin插件

module.exports = {
  entry: '項目的入口js文件名字(相對路徑)',
  output: {
    path: path.resolve(__dirname, '輸出路徑根目錄'),
    filename: '打包后的js文件名字(可含路徑)'
  },
  //配置HtmlWebpackPlugin插件
  plugins:[
      new HtmlWebpackPlugin({
          title: '主入口HTML文件的<title>標簽內的文本',
          filename: '主入口HTML文件的名稱,一般為 index.html'
      })
  ]
};

完成以上配置后,我們可以再次通過npm run build來重新導出。

如果一切正常,我們就不需要再通過手動添加<script>標簽了,即使我們再新添js模塊也不需要手動添加。

但是,這里還有個問題,假如我們修改了某個模塊的名稱,或者刪除了某個模塊,那么原來生成的模塊js文件依然存在我們的輸出路徑下,需要手動刪除。

? 延伸閱讀

? HtmlWebpackPlugin詳解

CleanWebpackPlugin插件

使用WebStorm打開對應項目,通過終端(Terminal)安裝CleanWebpackPlugin:

npm install clean-webpack-plugin --save-dev

CleanWebpackPlugin插件能幫助我們清理打包導出路徑下的文件,這樣每次我們重新導出項目后,將沒有多余的模塊,這就很好解決了上一小節我們遇到的問題,我們再也不需要手動刪除更名后的原模塊文件,也不需要手動刪除不再使用的模塊。下面我們來新增CleanWebpackPlugin的配置來使其生效。

CleanWebpackPlugin配置

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');//引用CleanWebpackPlugin插件

module.exports = {
  entry: '項目的入口js文件名字(相對路徑)',
  output: {
    path: path.resolve(__dirname, '輸出路徑根目錄'),
    filename: '打包后的js文件名字(可含路徑)'
  },
  
  plugins:[
      new HtmlWebpackPlugin([
          title: '主入口HTML文件的<title>標簽內的文本',
          filename:'主入口HTML文件的名稱,一般為 index.html'
      ]),
      //配置CleanWebpackPlugin插件
      new CleanWebpackPlugin(['需要清理的路徑', ...'其他需要清理的路徑'])
  ]
};

配置完成以后可以再次執行npm run build,這時,所配置的清理路徑下的文件將先被刪除。隨后才會生成我們需要的文件,如此,我們不再需要手動刪除無用的模塊了。

? 延伸閱讀

? CleanWebpackPlugin詳解

SplitChunksPlugin插件

經過了以上漫長的環境搭建操作,我們已經基本完成了項目打包自動化了,接下來我們還需要考慮的是如何優化我們的打包。雖然我們已經做到了多模塊自動化導出,但是假設我們在多模塊中同時使用了某個模塊,則該被使用的模塊將會被重復導入到各個使用它的模塊當中,也即是產生了重復的冗余代碼。

webpack4.0自帶的SplitChunksPlugin插件可以解決這個問題,不需要通過npm來安裝新的工具包或插件。下面我們來看看怎么添加SplitChunksPlugin配置。

SplitChunksPlugin配置

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
  entry: '項目的入口js文件名字(相對路徑)',
  output: {
    path: path.resolve(__dirname, '輸出路徑根目錄'),
    filename: '打包后的js文件名字(可含路徑)'
  },
  
  plugins:[
      new HtmlWebpackPlugin([
          title: '主入口HTML文件的<title>標簽內的文本',
          filename:'主入口HTML文件的名稱,一般為 index.html'
      ]),
      new CleanWebpackPlugin(['需要清理的路徑', ...'其他需要清理的路徑']),
  ],
  //配置SplitChunksPlugin
  optimization: {
    splitChunks: {
      cacheGroups: {
        commons: {
          name: "commons",
          chunks: "initial",
          minChunks: 2,
          minSize:1
        }
      }
    }
  }
};

執行npm run build后,如果有重復使用的模塊,那么在輸出目錄下應該多了一個commons.js文件。

? 延伸閱讀

? SplitChunksPlugin配置詳解

chunkhash緩存配置

有過前端程序開發的程序員,應該對文件緩存都有所了解。緩存用得好可以大大減少網絡加載的負擔,但是如果不注意,有可能希望重新加載新資源的時候,卻加載的是緩存資源。webpack工具包為我們提供了緩存相關的配置,能滿足我們兩個需求:

  1. 在導出程序包的時候僅導出發生變化的模塊;
  2. 文件發生更新的時候,能保證網絡加載時能渠道最新的文件,而不是緩存文件。

基于以上兩點,我們有必要為項目添加chunkhash緩存配置,下面我們來看看如何添加:

webpack.config.js

module.exports = {
    output: {
    path: path.resolve(__dirname, '輸出路徑根目錄'),
    filename: '打包后的js文件名字.[chunkhash].js(可含路徑)'
  }
}

我們僅僅需要修改output字段的filename屬性,即可達到配置目的。在filename的值當中,將[chunkhash]插入到你想加入MD5字符串的位置,例如,filename: 'bundle.[chunkhash].js'

執行npm run build后生成的文件名,應該類似于bundle.7f150679794890f46e2f.js,那么我們的緩存配置就完成了。

CopyWebpackPlugin插件

我們在項目開發過程中,可能會遇到某些文件不需要或不能使用webpack包裝的,但是當我們發布項目的時候,這些文件也必須添加到最終的發布文件里面。這種情況下,我們可以引入CopyWebpackPlugin。CopyWebpackPlugin能夠幫助我們把必要的文件拷貝到我們的發布路徑里,這樣就達到了發布的目的了。CopyWebpackPlugin的使用和其他插件也很相像,請看下面的例子。

CopyWebpackPlugin的安裝

使用WebStorm打開對應項目,通過終端(Terminal)安裝CopyWebpackPlugin:

npm install copy-webpack-plugin --save-dev

CopyWebpackPlugin的使用

CopyWebpackPlugin的使用方法也和其他webpack插件非常類似,在webpack.config.js加入相應的配置即可。

webpack.config.js

const CopyWebpackPlugin =require("copy-webpack-plugin");

module.exports = {
    plugins:[
        new CopyWebpackPlugin([
            {
                from: '需要拷貝的文件名稱(可含路徑)',
                to:'新的文件名稱(可含路徑)'
            }
        ])
    ]
}

通過執行npm run build后,相應的文件將被拷貝到對應的位置和名稱了。

? 延伸閱讀

? CopyWebpackPlugin配置詳解

三、運行調試

代碼查閱配置

mode字段

我們在開發過程中,難免會遇到程序報錯,一旦遇到報錯,我們希望能夠直達報錯所在代碼查看報錯原因。

當我們將webpack.config.jsmode字段配置為"production"的時候,webpack工具包會將導出的文件進行壓縮,所以是打包之后的文件是難以閱讀的。

webpack.config.js

module.exports = {
    mode:"production"   //可選值為"none", "development"和"production"
}

那么我們可以將mode字段的值設為"development",這樣當我們在瀏覽器查看報錯時,代碼的可閱讀性得到了大大提高。

webpack.config.js

module.exports = {
    mode:"development"  //可選值為"none", "development"和"production"
}

devtool字段

但畢竟是經過打包的代碼,如果我們希望更進一步還原原始代碼的話,可以增加devtool字段,如下:

webpack.config.js

module.exports = {
    mode:"development",
    devtool:"inline-source-map"
}

通過執行npm run build后,我們新生成的程序包,如果在運行時報錯的話,那么我們可以查看完全還原的代碼,迅速找到錯誤原因。

自動編譯

watch命令

這么久以來,每次我們隊項目進行改動,或對配置進行改動之后,必須要通過手動執行npm run build才能查看編譯后的文件,那么有沒有像prettier那樣的觀察器可以配置呢?

答案是有的,但是配置方式并不像prettier觀察器,自動編譯無法通過webStorm來配置。相應的,我們來看看該如何讓我們的項目自動編譯吧。

首先來修改package.json文件

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js",
    "watch": "webpack --watch"
  }
}

我們在打包配置文件package.json中的scripts字段添加了watch屬性,實際運行是webpackwatch命令。現在我們在webStorm的終端(Terminal)中執行npm run watch,執行之后終端并沒有結束,是因為它正在觀察是否有文件發生了修改,一旦發現則會自動編譯該文件。

現在只要我們執行過一遍npm run watch之后,就不在需要每次改動文件后去執行npm run build來重新編譯文件了。

? 注意

? npm run watch命令執行之后,終端是不會自動結束的。如果需要關閉watch進程,只要關閉終端窗口即可。如果還需要執行其他命令,可以開啟新的終端窗口。

webpack-dev-server工具包

前面我們已經使用webpack的watch命令來自動編譯代碼了,那么,如果編譯完代碼以后,網頁還可以自動重新加載這些變動,我們的開發環境就更加智能了。下面我們來看看怎么可以做到熱加載。

webpack-dev-server安裝

使用WebStorm打開對應項目,通過終端(Terminal)安裝webpack-dev-server:

npm install webpack-dev-server --save-dev

安裝完后,讓我們來看看如何添加相應的配置

webpack.config.js

module.exports = {
    devServer:{
        contentBase:"網站服務器的根目錄,也即是我們的打包輸出路徑"
    }
}

webpack.config.js配置文件中我們添加了devServer的字段,并為其添加contentBase的屬性。然后我們需要到package.json配置文件中添加啟動網站服務器的腳本配置。

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --config webpack.config.js",
    "watch": "webpack --watch",
    "server": "webpack-dev-server --open"
  }
}

最后,讓我們執行npm run server命令來啟動網站服務器吧。啟動服務器后,會使用默認瀏覽器打開地址http://localhost:8080。現在我們修改文件后,文件會自動編譯打包,而且網頁也會自動更新了。

? 注意

? 與上面npm run watch提到的問題一樣,執行完npm run server后終端是不會自動結束的。如果需要關閉server進程,只要關閉終端窗口即可。如果還需要執行其他命令,可以開啟新的終端窗口。

? 延伸閱讀

? webpack-dev-server詳解


@Freeman

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容