首先在建立好的項目文件夾下面執行javascript
npm init
根據對應提示完成package.json
文件初始化。css
import App from 'your-module';
0.0.0
。主版本號:當進行了大都改動或者對api有不少不兼容修改時應該進行版本號升級。次版本號:增長了部分特性或者優化時升級該版本。修訂號:當修改了項目bug或者小的改動時升級該版本。package.json
的main中的路徑來進行索引const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { mode: 'development', entry: path.resolve(__dirname, 'app.js'), output: { path: path.join(__dirname, 'dist'), filename: "main.js", }, module: { rules: [ { test: /(\.jsx|\.js)$/, exclude: /node_modules/, loader: 'babel-loader' }, {test: /\.css$/, loader: 'style-loader!css-loader'}, { test: /\.(png|jpg|gif|svg)$/, //對圖片文件,使用 url-loader裏的加載器處理 loader: 'url-loader', options: { limit: 8192, //限制圖片文件字節,大於8KB則不生成base64 用路徑引用替代(至關於file-loader) name: '[name].[ext]?[hash]' //文件名 } } ] }, plugins: [ new HtmlWebpackPlugin({ hash: true, template: './index.html', }), new webpack.HotModuleReplacementPlugin(), // 熱更新插件 ], devtool: 'inline-source-map', // map文件追蹤錯誤提示 devServer: { // 啓動本地開發的node服務器環境(webpack-dev-server) port: 8080, // 端口 contentBase: './dist', // 開發環境的服務目錄 historyApiFallback: true, host: '0.0.0.0', inline: true, hot: true, }, };
在開發環境中就是一些很常見的配置,保證咱們能夠進行本地的組件模塊開發便可。html
const path = require('path'); const webpack = require('webpack'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const NODE_ENV = process.env.NODE_ENV; const prdWebpackConfig= { mode: 'production', entry: path.resolve(__dirname, 'src/index.js'), output: { path: path.join(__dirname, 'lib'), filename: "chat-react.js", libraryTarget: 'commonjs2' //模塊輸出方式 }, externals: { react: 'react' //打包時候排除react }, module: { rules: [ { test: /(\.jsx|\.js)$/, exclude: /node_modules/, loader: 'babel-loader' }, {test: /\.css$/, loader: 'style-loader!css-loader'}, { test: /\.(png|jpg|gif|svg)$/, loader: 'url-loader', options: { limit: 8192, name: '[name].[ext]?[hash]' } } ] }, plugins: [] }; if (NODE_ENV !== 'publish') { prdWebpackConfig.plugins.push(new BundleAnalyzerPlugin()) } module.exports = prdWebpackConfig;
打包模塊與咱們寫應用邏輯代碼有些不一樣,因爲大部分用戶使用模塊都不會去再對模塊進行es5轉換,全部咱們發佈的模塊也應該是已經被轉換以後的代碼,並且須要提供模塊的引用入口以及排除模塊本身之外的代碼。java
entry
在完成模塊打包時,修改了項目的入口路徑entry。配置打包的entry路徑爲該發佈模塊的文件,而不是開發環境中的項目入口。output
path爲生成的目錄位置以及目錄名,filename 爲打包後的模塊文件。libraryTarget 爲生成模塊的引入方式,由於咱們寫的react組件基本爲模塊化打包開發方式,選擇使用commonjs2配置,最後打包會生成符合commonjs規範的模塊,具體配置規則可見output.libraryTarget externals
由於咱們是基於react的組件,可是在完成打包的時候若是將react也打包進去,庫的體積就會變大,並且react庫一般會在使用組件的時候被外部引入,因此咱們要排除react。externals 配置 BundleAnalyzerPlugin
在非發佈命令下打包時候,咱們能夠用該插件審查一下打包完成的包體積大小。因此只需判斷下在npm scripts中設置的NODE_ENV環境變量,按需使用該插件便可。mode
在webpack4中設置mode爲production,會本身啓用生產環境的部分配置優化,此時UglifyJsPlugin壓縮插件也會啓用,幫助完成咱們的library的代碼壓縮。1.發佈前須要正確配置package.json中的main內容,使用時會根據該內容自動索引模塊內容node
"main": "lib/chat-react.js"
2.在發佈前咱們須要完成打包,爲了確保咱們發佈的版本爲編譯完成後的版本,能夠利用npm scripts中的prepublishOnly鉤子。這個鉤子能夠保證咱們在執行npm publish
的前進行打包操做。react
"scripts": { "prepublishOnly": "NODE_ENV='publish' npm run build" }
prepublish鉤子也會在執行npm publish
前觸發該週期,我使用的是npm v5.5版本,在使用npm install的時候prepublish週期也會被觸發,翻到了一篇阮老師的文章,其中提到npm5版本時候會改掉這一狀態,prepublish將只在npm publish命令以前運行,不過看起來跟預期不一致。在15年的npm官方討論issue裏說未來可能會廢棄prepublish或者prepublishOnly某一個,不過翻看了官方npm script文檔對兩個鉤子的用法都有說明,看起來是都保留了。 webpack
3.配置.npmignore
,.npmignore的用法與.gitignore一致。由於咱們在執行npm publish發佈命令時會將項目下掉全部文件都發布至npm,.npmignore
能夠忽略掉咱們不須要發佈都文件git
node_modules example src .babelrc app.js index.html package-lock.json webpack.config.js webpack.prd.js
4.編寫使用文檔(readme)。爲咱們的模塊組件編寫使用文檔是必不可少的,README.md
使用的是markdown語法,記不住語法的小夥伴也可使用個人在線markdown編輯器。github
npm login
登陸你的npm帳號npm publish
便可完成發佈若是你意外的發佈錯了包,使用npm unpublish +包名便可刪除該包。如:web
npm unpublish chat-react
若是你想撤回指定版本,執行npm unpublish + 包名@版本號。如:
npm unpublish chat-react@1.0.0
Tips:npm爲了保證包不會影響到使用者,發佈的版本只能在24小時內進行撤回。
文章代碼演示GitHub地址