隨着大前端的來臨,須要前端處理愈來愈多的事情,不只侷限頁面的交互,項目的需求愈來愈多,更多的邏輯須要在前端完成,爲了簡化開發的複雜度,前端社區涌現出了不少好的實踐方法。javascript
這些改進確實大大的提升了咱們的開發效率,可是利用它們開發的文件每每須要進行額外的處理才能讓瀏覽器識別,而手動處理又是很是繁瑣的,這就爲webPack類的工具的出現提供了需求。css
webpack是一個模塊打包工具,它能夠將許多鬆散的模塊按照依賴和規則打包成符合生產環境部署的前端資源。還能夠將按需加載的模塊進行代碼分割,等到實際須要的時候再異步加載。html
把項目當作一個總體,經過一個給定的主文件(如:index.js),從這個文件開始找到你的項目的全部依賴文件,使用loaders處理它們,最後打包爲一個(或多個)瀏覽器可識別的JavaScript文件。前端
npm install -g webpack
mkdir webpack_pratice
進入到webpack_pratice,建立package.json文件,在終端中使用npm init命令能夠自動建立這個package.json文件java
npm init
輸入這個命令後,終端會問你一系列諸如項目名稱,項目描述,做者等信息,不過不用擔憂,若是你不許備在npm中發佈你的模塊,這些問題的答案都不重要,回車默認便可。
package.json是一個標準的npm說明文件,裏面蘊含了豐富的信息,包括當前項目的依賴模塊,自定義的腳本任務等等。node
npm install webpack webpack-cli --save-dev npm install typescript ts-loader --save-dev npm install style-loade node-sass sass-loader css-loader --save-dev npm install extract-text-webpack-plugin@next --save-dev npm install html-webpack-plugin --save-dev
注意:extract-text-webpack-plugin 最新版本爲 3.0.2,這個版本尚未適應 webpack 4 的版本,因此安裝的時候須要extract-text-webpack-plugin@nextwebpack
index.htmlgit
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>webpack測試</title> </head> <body> <div class="test-block"> Webpack </div> </body> </html>
main.tsgithub
import './main.scss' class TestMain { name: string; age: number; constructor ( name: string, age: number ) { this.name = name; this.age = age; }; testFun() { console.log(this.name + '---' + this.age) } } let testMain = new TestMain("Miss D", 18); testMain.testFun();
common.scssweb
html,body{ margin: 0; padding: 0; font-size: 25px; color: yellow; }
main.scss
@import "common.scss"; .test-block{ width: 300px; height: 300px; margin: 0 auto; background: green; }
{ "compilerOptions": { "module": "commonjs", "target": "es5", "sourceMap": true }, "exclude": [ "node_modules" ] }
const path = require('path'); const htmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); module.exports = { entry: './src/main.ts', //模塊的入口 output: { //輸出配置 filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist') }, module: { //資源模塊的處理器 rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: path.resolve(__dirname, 'node_modules'), include: path.resolve(__dirname, 'src'), }, { test: /\.scss$/, use: ExtractTextPlugin.extract({ fallback: { loader: "style-loader" }, use: [ { loader: "css-loader", }, { loader: "sass-loader" } ] }) }] }, plugins: [ //插件配置 new ExtractTextPlugin({ filename: "[name].min.css" }), new htmlWebpackPlugin({ template: './src/index.html', inject: 'head' }) ] }
{ "name": "webpack-pratice", "version": "1.0.0", "description": "", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack --config webpack.config.js" }, "author": "", "license": "ISC", "devDependencies": { "html-webpack-plugin": "^3.2.0", "css-loader": "^2.1.0", "extract-text-webpack-plugin": "^4.0.0-beta.0", "node-sass": "^4.11.0", "sass-loader": "^7.1.0", "style-loader": "^0.23.1", "ts-loader": "^5.3.3", "typescript": "^3.3.3333", "webpack": "^4.29.6", "webpack-cli": "^3.2.3" } }
npm run build
打包結果
項目的scss樣式和typescript文件,解析成瀏覽器能識別的css和javascript文件,且自動引入到index.html文件中。
若是使用webpack,style-loader出現的錯誤:
ERROR in {project}/node_modules/style-loader/lib/addStyles.js Module not found: Error: Can't resolve './urls' in '{project}\node_modules\style-loader\lib'
解決方法: 直接修改{project}/node_modules/style-loader/lib/addStyles.js文件: 把require(「./urls」)改成require(「./urls.js」)